jvm 参数小结

0.参数默认值

java -XX:+PrintFlagsFinal

可以使用 此命令查看参数默认值。示例图见图0-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

图6-1 eclipse中指定vm参数

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

通过代码检验

时间: 2024-09-20 15:11:43

jvm 参数小结的相关文章

xmn-运行Java程序时,JVM参数没有生效,请高手帮忙看看。

问题描述 运行Java程序时,JVM参数没有生效,请高手帮忙看看. 小弟在学习GC的过程中,遇到JVM参数未生效的问题,一时不知道怎么解决,请路过大神帮帮忙指点指点,小弟谢过! 运行环境为:Win7 64bit, 4 core. 1,程序如下 public class PSGCDirectOldDemo { /** * @para args * @throws InterruptedException */ public static void main(String[] args) throw

一个性能较好的JVM参数配置

一个性能较好的web服务器jvm参数配置: -server//服务器模式 -Xmx2g //JVM最大允许分配的堆内存,按需分配 -Xms2g //JVM初始分配的堆内存,一般和Xmx配置成一样以避免每次gc后JVM重新分配内存. -Xmn256m //年轻代内存大小,整个JVM内存=年轻代 + 年老代 + 持久代 -XX:PermSize=128m //持久代内存大小 -Xss256k //设置每个线程的堆栈大小 -XX:+DisableExplicitGC //忽略手动调用GC, Syste

在java代码中获取JVM参数(转)

近日关注性能调优,关注JMX,发现java.lang.management.*之强大.同时查阅了资料,整合一版关于JVM参数获取的note,仅供参考:   Java代码           MemoryMXBean memorymbean = ManagementFactory.getMemoryMXBean();        MemoryUsage usage = memorymbean.getHeapMemoryUsage();        System.out.println("INI

javaw方式启动程序怎样传递JVM参数

问题描述 RT,由于是JAVA应用程序需屏蔽dos窗口,因此采用批处理调用,使用javaw调用程序,但这种方式不能传入JVM参数,请问这种情况怎样才能解决目前的批处理文件我是这样写的:startC:Progra~1Javajdk1.6.0_06binjavaw%JAVA_VM%%MEM_ARGS%-Djava.library.path="%dctmSharedPath%"-classpath"%CLASSPATH%"com.nantian.cdws.mdbimpor

在Maven2中运行单个测试用例并添加JVM参数

都说Maven2是Ant的替代品,今天稍微使用了下Maven,记录备忘. 通过Maven单独运行一个Junit测试用例(无需配置surefire): mvn -Dtest=TestXXX test 为Maven运行添加JVM参数,比如想给运行Maven的JVM分配更多内存,或者进行profiling等.有两种方法,一种是全局方法,即设置一个全局的环境变量MAVEN_OPTS. linux下可修改.profile或者.bash_profile文件:export MAVEN_OPTS=-Xmx102

怎么使用java代码查看我设置的jvm参数?

问题描述 如题我设置了一些 jvm参数我想在页面上显示出来我设置的结果怎么使用java代码 获取设置的jvm参数 解决方案 ManagementFactory.getRuntimeMXBean().getInputArguments()

[Java]jvm参数选项中文文档

本文是基于最新的SUN官方文档Java SE 6 Hotspot VM Options 编写的译文.主要介绍JVM中的非稳态选项及其使用说明. 为了让读者明白每个选项的含义,作者在原文基础上补充了大量的资料.希望这份文档,对正在研究JVM参数的朋友有帮助!  另外,考虑到本文档是初稿,如有描述错误,敬请指正.  非稳态选项使用说明 -XX:+<option> 启用选项 -XX:-<option> 不启用选项 -XX:<option>=<number> 给选项

tomcat,zookeeper,activeMQ,Kafka设置jvm参数

1,tomcat设置jvm参数 设置方法: 在tomcat bin 目录增加配置:setenv.sh #add tomcat pid CATALINA_PID="$CATALINA_BASE/conf/tomcat.pid" #add java opts JAVA_OPTS=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true \ -server -Xmx1g -Xms1g -Xmn256m -XX:PermSi

java虚拟机参数设置 jvm参数设置

java进程命令行使用方式如下: java [-options] class [args...] -options 表示虚拟机的启动参数, class为带有main()函数的java类的全名称 args表示传递给主函数main()的参数 多个用空格 分割即可. 如以下代码,看一下如何设置参数并且获取到参数. package cn.xhgg.test; public class JvmTest { public static void main(String[] args) { for (int