几个重要的jvm参数配置及建议

来源:互联网 发布:淘宝运营推广计划书 编辑:程序博客网 时间:2024/06/06 03:17

jvm配置参数比较多,只有当经常使用时,才能在脑中不忘。而在现在的工作生活中,大家可能经常跟这些参数打交道的时间比较少,只有当线上的服务出问题,才会去熟悉这些参数。这些是自己工作中调试用到的几个重要的参数,留作以后翻看。

建议:

1:建议用64位操作系统,Linux下64位的jdk比32位jdk要慢一些,但是吃得内存更多,吞吐量更大。

2:XMX和XMS设置一样大,MaxPermSize和MinPermSize设置一样大,这样可以减轻伸缩堆大小带来的压力。

3:调试的时候设置一些打印JVM参数,如-XX:+PrintClassHistogram-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+PrintHeapAtGC-Xloggc:log/gc.log,

这样可以从gc.log里看出一些端倪出来。

4:系统停顿的时候可能是GC的问题也可能是程序的问题,多用jmap和jstack查看,或者killall-3java,然后查看java控制台日志,能看出很多问题。

有一次,网站突然很慢,jstack一看,原来是自己写的URLConnection连接太多没有释放,改一下程序就OK了。

5:仔细了解自己的应用,如果用了缓存,那么年老代应该大一些,缓存的HashMap不应该无限制长,建议采用LRU算法的Map做缓存,LRUMap的最大长度也要根据实际情况设定。

6:垃圾回收时promotionfailed是个很头痛的问题,一般可能是两种原因产生,第一个原因是救助空间不够,救助空间里的对象还不应该被移动到年老代,但年轻代又有很多对象需要放入救助空间;

第二个原因是年老代没有足够的空间接纳来自年轻代的对象;这两种情况都会转向FullGC,网站停顿时间较长。第一个原因我的最终解决办法设置XX:SurvivorRatio=1 ,并把MaxTenuringThreshold去掉,这样即没有暂停又不会有promotoin failed,而且更重要的是,年老代和永久代上升非常慢(因为好多对象到不了年老代就被回收了),所以CMS执行频率非常低,好几个小时才执行一次,这样,服务器都不用重启了,第二个原因我的解决办法是设置CMSInitiatingOccupancyFraction为某个值(假设70),这样年老代空间到70%时就开始执行CMS,年老代有足够的空间接纳来自年轻代的对象。

7:不管怎样,永久代还是会逐渐变满,所以隔三差五重起java服务器是必要的

8:采用并发回收时,年轻代小一点,年老代要大,因为年老大用的是并发回收,即使时间长点也不会影响其他程序继续运行,网站不会停顿。



重要配置:

1、-XX:+DisableExplicitGC

这个将会忽略手动调用GC的代码使得 System.gc()的调用就会变成一个空调用,完全不会触发任何GC。最主要的原因是为了防止某些手贱的同学在代码里到处写System.gc()的调用而干扰了程序的正常运行吧。有些应用程序本来可能正常跑一天也不会出一次full GC,但就是因为有人在代码里调用了System.gc()而不得不间歇性被暂停。使用这个可能会抛出这个异常:java.lang.OutOfMemoryError: Direct buffer memory  

2、-XX:+UseConcMarkSweepGC

设置并发收集,启用CMS策略。测试中配置这个以后,-XX:NewRatio=4的配置失效了。所以,此时年轻代大小最好用-Xmn设置。



3、-XX:+CMSClassUnloadingEnabled 

打开永久带垃圾回收

4、-XX:+CMSPermGenSweepingEnabled

这个参数表示在使用CMS垃圾回收机制的时候是否启用类卸载功能。默认这个是设置为不启用的,所以你想启用这个功能你需要在Java参数中明确的设置下面的参数:-XX:+CMSClassUnloadingEnabled。 如果你启用了CMSClassUnloadingEnabled ,垃圾回收会清理持久代,移除不再使用的classes。这个参数只有在-XX:+UseConcMarkSweepGC 也启用的情况下才有用。一般都是:-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled  -XX:+CMSPermGenSweepingEnabled 这三个同时使用。可以防止 java.lang.OutOfMemoryError: PermGen space


5、-XX:CMSInitiatingOccupancyFraction=80

默认CMS是在tenured generation沾满68%的时候开始进行CMS收集,如果你的年老代增长不是那么快,并且希望降低CMS次数的话,可以适当调高此值

6、-XX:+CMSParallelRemarkEnabled

为了减少第二次暂停的时间,开启并行remark

7、-XX:+UseCMSCompactAtFullCollection

由于CMS收集器会产生碎片,此参数设置在垃圾收集器后进行一次内存碎片整理,使用并发收集器时,开启对年老代的压缩.

8、-XX:+UseFastAccessorMethods 

原始类型的快速优化

9、-XX:+UseCMSInitiatingOccupancyOnly

指定HotSpot VM总是使用-XX:CMSInitiatingOccupancyFraction的值作为old的空间使用率限制来启动CMS垃圾回收。如果没有使用-XX:+UseCMSInitiatingOccupancyOnly,那么HotSpot VM只是利用这个值来启动第一次CMS垃圾回收,后面都是使用HotSpot VM自动计算出来的值

10、配置jconsle监控参数:

-server -Dcom.sun.management.jmxremote.port=8903 (自定义端口)
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Djava.rmi.server.hostname=192.168.10.38 (监控的服务器IP)

原创粉丝点击