jvm诊断与优化(2)

jvm内存:如图从左到右依次为 jvm堆:

[ (新生代)PSYoungGen:{ Eden\S0(form)\S1(to) } \ (老年代)ParOldGen:{ Old Memory} ] \ (方法区/持久区)Perm \ 再后就是系统内存了

jvm诊断与优化(2)_第1张图片

-XX:+PrintFlagsFinal     //查看jvm所有的系统参数值

-XX:PrintVMOptions    //查看你当前指定的参数

如   java -Xmx20M -XX:+PrintVMOptions -XX:+PrintGC jvm.Test 20

VM option '+PrintVMOptions'
VM option '+PrintGC'
-XX:+PrintCommandLineFlags  //查看显式与隐式指定的参数

如:java -Xmx20M -XX:+PrintCommandLineFlags -XX:+PrintGC jvm.Test 20

-XX:InitialHeapSize=20971520     //系统指定
-XX:MaxHeapSize=20971520         //系统指定
-XX:+PrintCommandLineFlags       //用户指定
-XX:+PintGC                      //...
-XX:+UseCompressedOops 
-XX:-UseLargePagesIndividualAllocation 
-XX:+UseParallelGC

  -XX:PrintGC    //输出GC处理信息

package jvm;

public class Test {
	
	public static void main(String[] args) {
		int length = Integer.parseInt(args[0]);
		for (int i = 0; i < length; i++) {
			byte[] a = new byte[1*1024*1024];
		}
		//单位bytes
		System.out.println("maxMemory"+Runtime.getRuntime().maxMemory()/1000/1000+"M");
		System.out.println("maxMemory"+Runtime.getRuntime().freeMemory()/1000/1000+"M");
		System.out.println("maxMemory"+Runtime.getRuntime().totalMemory()/1000/1000+"M");
	}
}
java -Xmx10M -XX:+PrintGC jvm.Test 5

[GC 1642K->576K(9728K), 0.0165492 secs]
[GC 2708K->520K(9728K), 0.0012726 secs]

输出说明 [2708K->520K] 指原有2708K 回收后变成 520K; [9728K] 可用堆空间总和大约为10M; 最后是GC所花的时间

 -XX:+PrintGCDetails   //GC更加详细的信息

java -Xmx20M -XX:+PrintGCDetails jvm.Test 20

[GC [PSYoungGen: 5831K->496K(6656K)] 5831K->576K(19968K), 0.0014249 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [PSYoungGen: 5806K->472K(6656K)] 5886K->552K(19968K), 0.0008980 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [PSYoungGen: 5636K->440K(6656K)] 5716K->520K(19968K), 0.0019736 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
 PSYoungGen 
    total 6656K, used 5712K [0x00000000ff900000, 0x0000000100000000, 0x0000000100000000)
    eden space 6144K, 85% used [0x00000000ff900000,0x00000000ffe261e8,0x00000000fff00000)
    from space 512K, 85% used [0x00000000fff00000,0x00000000fff6e010,0x00000000fff80000)
    to   space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
 ParOldGen  
    total 13312K, used 80K [0x00000000fec00000, 0x00000000ff900000, 0x00000000ff900000)
    object space 13312K, 0% used [0x00000000fec00000,0x00000000fec14000,0x00000000ff900000)
 PSPermGen  
    total 21504K, used 2549K [0x00000000f9a00000, 0x00000000faf00000, 0x00000000fec00000)
    object space 21504K, 11% used [0x00000000f9a00000,0x00000000f9c7d570,0x00000000faf00000)

输出说明: 

[user] 用户CPU耗时 [sys] 系统cpu耗时 [real] GC实际经历时间; GC的打印信息可以看到只对新生代做了内存回收

下面是jvm内存的信息了

新生代 可用空间为 6656K(eden+from) 用了 5712k [下界,当前上界,上界]         

--当前空间的最大值:用上界减下界就能得到 ,如新生代空间 (0x0000000100000000 -  0x00000000ff900000)/1024 = eden + from + to  = 6656+512 = 7168

--当前空间分配的大小 : 用当前上界减去下界; 如果当前上界等于下界,说明当前的堆空间没有扩大的可能

 -XX:+PrintHeapAtGc  打印更加全面的堆信息(略)

-XX:+PrintGCTimeStamps   分析GC发生的时间

-XX:+PrintGCApplicationConcurrentTime  打印应用程序的执行时间

-XX:+PrintGCApplicationStoppedTime  打印应用程序由于GC而产生的停顿时间

-XX:+PrintReferenceGC   跟踪系统内的软引用、弱引用、虚引用和Finallize队列

-Xloggc   将GC的日志以文件的形式输出如:  java -Xmx20M  -Xloggc:E:/gc.log  jvm.Test  20

-verbose:class  等价于 -XX:TraceClassLoading  -XX:TraceClassUnloading    //跟踪类的加载与卸载

-XX:+PrintClassHistogram     查看系统中类的分布情况; 运行后在控制后按Ctrl+Break


你可能感兴趣的:(jvm诊断与优化(2))