深入学习JVM笔记二堆的分配参数

堆的分配参数

-XX:+PrintGCDetails

打印GC详细信息

-XX:+PrintHeapAtGC

每次一次GC后,都打印堆信息

-Xmx –Xms

指定最大堆和最小堆

-Xmx20m -Xms5m 

System.out.print("Xmx=");

System.out.println(Runtime.getRuntime().maxMemory()/1024.0/1024+"M");

 

System.out.print("free mem=");

System.out.println(Runtime.getRuntime().freeMemory()/1024.0/1024+"M");

 

System.out.print("total mem=");

System.out.println(Runtime.getRuntime().totalMemory()/1024.0/1024+"M");

 

-Xmn

设置新生代大小

-XX:NewRatio

新生代(eden+2*s)和老年代(不包含永久区)的比值

4 表示 新生代:老年代=1:4,即年轻代占堆的1/5

-XX:SurvivorRatio

设置两个Survivor区和eden的比

8表示 两个Survivor :eden=2:8,即一个Survivor占年轻代的1/10

-XX:+HeapDumpOnOutOfMemoryError

OOM时导出堆到文件

-XX:+HeapDumpPath

导出OOM的路径

-XX:OnOutOfMemoryError

在OOM时,执行一个脚本

"-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat%p“

 当程序OOM时,在D:/a.txt中将会生成线程的dump

可以在OOM时,发送邮件,甚至是重启程序

堆的分配参数– 总结

根据实际事情调整新生代和幸存代的大小

官方推荐新生代占堆的3/8

幸存代占新生代的1/10

在OOM时,记得Dump出堆,确保可以排查现场问题

-XX:PermSize  -XX:MaxPermSize

设置永久区的初始空间和最大空间

他们表示,一个系统可以容纳多少个类型

栈大小分配

-Xss

通常只有几百K

决定了函数调用的深度

每个线程都有独立的栈空间

局部变量、参数分配在栈上


GC打印说明

-XX:+PrintGC

[GC 4790K->374K(15872K), 0.0001606 secs]  GC之前用了4790K之后用了374K堆总共大小15872K

-XX:+PrintGCDetails的输出

Heap

新生代状况

 defnew generation   total 13824K, used11223K [0x27e80000, 0x28d80000, 0x28d80000)

对象出生的地方eden

 eden space 12288K,  91% used[0x27e80000, 0x28975f20, 0x28a80000)

幸存代

 from space 1536K,   0% used[0x28a80000, 0x28a80000, 0x28c00000)

幸存代

 to   space 1536K,   0% used [0x28c00000, 0x28c00000, 0x28d80000)

老年代

 tenured generation   total 5120K, used 0K [0x28d80000,0x29280000, 0x34680000)

  the space 5120K,   0% used[0x28d80000, 0x28d80000, 0x28d80200, 0x29280000)

永久区

 compacting perm gen  total 12288K, used 142K [0x34680000, 0x35280000,0x38680000)

  the space 12288K,   1% used[0x34680000, 0x346a3a90, 0x346a3c00, 0x35280000)

   ro space 10240K,  44% used[0x38680000, 0x38af73f0, 0x38af7400, 0x39080000)

   rw space 12288K,  52% used[0x39080000, 0x396cdd28, 0x396cde00, 0x39c80000)


你可能感兴趣的:(jvm,虚拟机,深入学习)