jvm内存:如图从左到右依次为 jvm堆:
[ (新生代)PSYoungGen:{ Eden\S0(form)\S1(to) } \ (老年代)ParOldGen:{ Old Memory} ] \ (方法区/持久区)Perm \ 再后就是系统内存了
-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