jvm 参数小结

0.参数默认值

java -XX:+PrintFlagsFinal
可以使用 此命令查看参数默认值。示例图见图0-1.
jvm 参数小结_第1张图片
图0-1 看到NewRatio默认值为2

1.内存相关

-Xmx   //Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;
-Xms   //Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;
-Xmn   //Java Heap 新生代大小,不熟悉最好保留默认值;
-Xss   //每个线程的Stack大小,不熟悉最好保留默认值;

-XX:MaxDirectMemorySize=128m  //设置最大堆外内存

-XX:SurvivorRatio=8

新生代中Eden大小 / survivor大小 的值,默认值为8。

-XX:NewRatio=2

老年代大小 / 新生代大小 的值,英文名字感觉像是取反了。默认值为2。即新生代占堆内存的1/3。

-XX:PermSize=128M 

设置永久代(方法区)的大小。

1.1 默认值

-server时最大堆内存是物理内存的1/4,但不超过1G。
VM 文档可参考: http://docs.oracle.com/javase/7/docs/technotes/guides/vm/

1.2 堆外内存

tomcat 7中使用了NIO,而这会占用一部分堆外内存。可通过 -XX:MaxDirectMemorySize=50m进行限制。
亲测有效果,堆外内存减少了200M,但堆内存+永久代+最大堆外内存还是小于进程的实际占用内存,小了147M。不得其解。

1.3 java8

java 8中PermSpace变为了Metaspace。如最大元空间尺寸就变为: -XX:MaxMetaspaceSize=xxm 

2. GC策略

2.1 新生代

-XX:+UseParNewGC //指定新生代的收集器为ParNew

2.2 老年代

-XX:+UseConcMarkSweepGC       //指定老年代的垃圾收集器为CMS
-XX:CMSInitiatingOccupancyFraction=85      //老年代占用比例达到85%时开始回收

2.3 年龄相关

-XX:MaxTenuringThreshold=15
指定对象到达15岁时被移到Old区。默认值为15。
需要注意的是,并不是年龄非得到达指定值后才会被移到老年代,JVM还有自己的一套规则,烦人。

3.GC日志

-Xloggc:../gclogdir/logc.txt          //指定gc日志的打印位置,注意必须指定到文件,不能为目录。
-XX:+PrintGCDateStamps 
-XX:+PrintGCDetails 
-XX:+PrintHeapAtGC 
-XX:+PrintTenuringDistribution
这个参数用于显示每次Minor GC时Survivor区中各个年龄段的对象的大小。

4.visual VM远程监控

使用JMX协议进行远程监控。
比如在A机器(windows)上查看B机器(linux)上j进程c(java进程)的情况。需要在c启动时加入参数:
-Djava.rmi.server.hostname=B机器ip 
-Dcom.sun.management.jmxremote=true 
-Dcom.sun.management.jmxremote.port=port 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false

5. 常见搭配

java -server -Xms2g -Xmx2g -Xmn512m -XX:CMSInitiatingOccupancyFraction=85 -XX:SurvivorRatio=8 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -Dcom.sun.management.jmxremote.port=2175 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../dumpdir/ -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -Xloggc:../gclogdir/

6.IDE中调试指定参数

Eclipse中修改待运行程序的参数。package视图|app.java|右键|Run As|Run Configurations,在Arguments 参数中的“VM arguments: ”中填入如下值即可,见图6-1。

-Xms256m -Xmx256m

jvm 参数小结_第2张图片

图6-1 eclipse中指定vm参数


eclipse中运行代码,实质就是它新开了一个线程运行你的代码。

通过代码检验

public class TestMemory {
    public static void main(String[] args) {
       System. out .println( " 内存信息 :" + toMemoryInfo());
       int[][][] a=new int[1000][1000][1000];
       System. out .println( " 内存信息 :" + toMemoryInfo());
    }

    public static String toMemoryInfo() {
       Runtime currRuntime = Runtime.getRuntime ();
       int nFreeMemory = ( int ) (currRuntime.freeMemory() / 1024 / 1024);
       int nTotalMemory = ( int ) (currRuntime.totalMemory() / 1024 / 1024);
       return nFreeMemory + "M/" + nTotalMemory +"M(free/total)" ;
    }

}
/*
 * 
 *  内存信息 :244M/246M(free/total)
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at TestMemory.main(TestMemory.java:5)
*/


你可能感兴趣的:(java-排障,调优)