Java启动参数的思考

前几年在将OS从32 bit升级到64 bit,以及虚拟机的内存调整到8G后,我把应用的Java启动参数重新写了一版,作为目前大部分Java应用的默认启动参数模版,这几年下来,发现在这个标准版的启动参数上还是犯了一些错误的。

1. -XX:+DisableExplicitGC
Java在实现RMI Server的时候会通过定时的调System.gc来强制做GC(即使程序里没用到RMI也会被启动),这个动作非常烦人,另外也是为了避免应用代码上显式去调用System.gc导致一些没必要的GC动作产生,所以当时就直接加上了这个参数。

现在来看,这个参数有个挺大的问题是,Direct ByteBuffer所占用的内存以及FileChannel.map所占用的内存当达到了他们的最大阈值时,需要依赖调用System.gc来强制释放下,如果加上了这个启动参数,就意味着这个强制的释放就无效了,这会导致的一个问题是,当old gen还没到达触发full gc/cms gc的条件,而堆外的Direct ByteBuffer/FileChannel.map占用的空间又超过了它们的最大阈值时,就会直接导致OOM,而这种情况下很有可能其实是可以借助显式调用System.gc来释放出足够的空间,不过话说我仍然觉得这是JDK设计上应该改进的一点,不应该在这个时候需要依赖System.gc来管理堆外的空间,大家可以翻下FileChannel.map的代码就会发现那里在等待System.gc执行的结果是写S的等待100ms,事实上很少有full gc/cms gc可以在100ms完成。

不过鉴于上面的状况,如果应用里有使用到不少Direct ByteBuffer或FileChannel.map的话,建议还是不要开启-XX:+DisableExplicitGC,如果是cms gc的,还是改为加上这个参数-XX:+ExplicitGCInvokesConcurrent,另外如果有RMI Server这种定时GC影响的,再调整下-Dsun.rmi.dgc.client.gcInterval和-Dsun.rmi.dgc.server.gcInterval这两个时间吧,时间单位是ms,也可以设置为Long.MAX_VALUE。

2. 缺少-XX:+UseCMSInitiatingOccupancyOnly
由于我们的Java应用的heap基本都是大于4G的,所以都是用的CMS,当时我在写启动参数的时候一直犹豫要不要加上-XX:+UseCMSInitiatingOccupancyOnly这个参数,一犹豫就没加,但事实上后来碰到了不少应用由于JVM自行触发CMS GC的机制导致CMS GC频繁,所以建议用CMS GC的场景下还是加上这个参数更稳妥。

3. -XX:MaxDirectMemorySize
话说在写启动参数的时候我都压根不知道这参数(要知道Java到底有哪些启动参数可用,以及默认值是多少,最靠谱的方法是在启动参数上加-XX:+PrintFlagsFinal或用jinfo -flags [pid]来查看),后来是由于有一次出现了有应用物理内存被耗光,排查的时候才发现是Direct ByteBuffer这块默认的大小是heap size,所以在有些情况下可能会出现Direct ByteBuffer这里占用了大量的空间,但heap这边又还不到触发Full gc/CMS gc的条件,就会有可能导致物理内存被耗光。
因此对于远程交互比较多的应用,建议还是加上这个参数,合理控制大小,不要让heap size+Direct Memory Size就把物理内存给耗光了。

ps: 关于Java常见问题的排查方法,重新专门写了一个PPT,涵盖了以下几种常见的Java问题的排查方法:
1. 类加载问题,例如NoSuchMethodException;
2. 内存问题,例如各种OOM;
3. 应用无响应问题,例如http访问后返回499;
4. CPU利用率问题,例如us耗尽;
5. Java进程退出问题。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

JVM8.0之后web推荐的配置:

JAVA_OPTS=‘-server -Xms256m -Xmx512m -XX:NewSize=128m -XX:MaxNewSize=256m -XX:MaxMetaspaceSize=256m 

-XX:+UseConcMarkSweepGC -XX:+UseCompressedOops -XX:MaxGCPauseMillis=50  -XX:+CMSParallelRemarkEnabled -XX:+CMSClassUnloadingEnabled

-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/home/ubuntu/gc.log‘

其中

-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/home/ubuntu/gc.log

参数用于开发和测试调试,查看JVM的相关gc日志

				
时间: 2024-10-05 14:25:31

Java启动参数的思考的相关文章

2、java 启动参数

1.java启动参数共分为三类: 其一是标准参数 (-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容:其二是非标准参数 (-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容:其三是非Stable参数 (-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用: 2.在使用命令java和javaw时,命令行格式如下,其中"argument"部分就可以设置一些参数. java [ options ] class [ ar

JAVA启动参数整理

http://blog.csdn.net/turkeyzhou/article/details/7619472 java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容: 其三是非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用: 一.标准参数 -client  设置jvm使用client模式

java启动参数一

java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容: 其三是非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用:本文主要描述标准参数部分,剩下的两个部分将会陆续推出: 标准参数如下: -client 设置jvm使用client模式,特点是启动速度比较快,但运行时性能和内存管理效率不高,通

java启动参数详解

java--jvm启动的参数其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容:其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容:其三是非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用: ? 标准参数中比较有用的:verbose -verbose:class 输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断.-verbose:gc 输出每次

java启动参数

-Xms:初始Heap大小,使用的最小内存 -Xmx:java heap最大值,使用的最大内存 上面两个值一般设置为同样的大小. -Xss:每个线程的Stack大小 -verbose:gc 现实垃圾收集信息 -Xloggc:gc.log 指定垃圾收集日志文件 刚刚了解到的一些参数(待实践测试) -Xmn:young generation的heap大小,一般设置为Xmx的3.4分之一 -XX:+UseParNewGC :缩短minor收集的时间 -XX:+UseConcMarkSweepGC :缩

JAVA启动参数三:非Stable参数

前面我们提到用-XX作为前缀的参数列表在jvm中可能是不健壮的,SUN也不推荐使用,后续可能会在没有通知的情况下就直接取消了:但是由于这些参数中的确有很多是对我们很有用的,比如我们经常会见到的-XX:PermSize.-XX:MaxPermSize等等: 下面我们将就Java HotSpot VM中-XX:的可配置参数列表进行描述: 这些参数可以被松散的聚合成三类: 行为参数(Behavioral Options):用于改变jvm的一些基础行为: 性能调优(Performance Tuning)

java启动参数二

非标准参数又称为扩展参数,其列表如下: -Xint 设置jvm以解释模式运行,所有的字节码将被直接执行,而不会编译成本地码. -Xbatch 关闭后台代码编译,强制在前台编译,编译完成之后才能进行代码执行: 默认情况下,jvm在后台进行编译,若没有编译完成,则前台运行代码时以解释模式运行. -Xbootclasspath:bootclasspath 让jvm从指定路径(可以是分号分隔的目录.jar.或者zip)中加载bootclass,用来替换jdk的rt.jar:若非必要,一般不会用到: -X

java虚拟机启动参数分类详解

官方文档见: http://docs.sun.com/source/819-0084/pt_tuningjava.html java启动参数共分为三类:其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容:其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容:其三是非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用: 一.标准参数中比较有用的: verbose -verbo

java程序启动参数-D是用来做什么的?

java程序启动参数 -D是用来做什么的呢?去查询了一下官方解释: Set a system property value. If value is a string that contains spaces, you must enclose the string in double quotes: java -Dfoo="some string" SomeClass 也就是说-D是用来在启动一个java程序时设置系统属性值的.如果该值是一个字符串且包含空格,那么需要包在一对双引号中