常用JVM配置参数

Trace跟踪参数

 -verbose:gc

 -XX:+printGC

 -XX:+PrintGCDetails

 -XX:+PrintGCTimeStamps

 -Xloggc:log/gc.log // 指定GC log的位置,以文件输出

 -XX:PrintHeapAtGC // 每一次GC后,都打印堆信息

// 类加载信息 

-XX:TraceClassLoading

   

-XX:+PrintClassHistogram

 -Ctrl +Break  打印类信息, 类的使用情况

堆的分配参数

-Xmx  -Xms

 - 指定最大堆 和最大堆

   System.out.print("Xmx");

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

   

内存分配

-Xmn 

 -设置新生代大小

 -XX:NewRatio

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

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

-XX:SurvivorRatio 

 - 设置两个SurvivorRatio  区和eden 的比

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

-XX: +HeapDumpOnOutOfMemoryError

     - OOM时导出堆到文件

-XX:+HeapDumpPath

     - 导出OOM的路径

-Xmx20m -Xms5m -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump

 -Vector v = new Vector();

 for(int i=0;i<25;i++){

  v.add(new byte[1*1024*1024]);

} // 模拟OOM

-XX:OnOutOfMemoryError

-在OOM时执行一个脚本

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

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

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

永久区分配参数

-XX:PermSize -XX:MaxPermSize

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

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

使用CGLIG等库的时候,可能会产生大量的类,这些类,有可能会撑爆永久区导致OOM

for(int i=0;i<100000;i++){

  CglibBean bean = new CglibBean("geym.jvm.ch3.perm.bean",new HashMap());

}

如果堆空间没有用完也抛出了OOM,有可能是永久区导致的

栈大小分配

-Xss  

    通常只有 几百K

    决定了函数调用的深度

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

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

    每个线程私有的区域,线程数*栈空间 =所有线程占的空间, 如果想让系统跑更多的线程,则需要把栈大小设置小一点。

原文地址:https://www.cnblogs.com/wind90/p/5457235.html