`
xiaolaogong
  • 浏览: 66861 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JAVA 调优

 
阅读更多

jstatd -J-Djava.security.policy=policy -J-Djava.rmi.server.hostname=192.168.3.125

CATALINA_OPTS="-Dcom.sun.management.jmxremote.port=8099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.3.243"

 

jstatd -J-Djava.security.policy=policy -J-Djava.rmi.server.hostname=192.168.3.125

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.254

JVM调优

一:JVM调优之串行垃圾回收

也就是默认配置,完成10万request用时153秒。JVM参数配置如下: 

  • $JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server  
  •  
  • -Xms2048M-Xmx2048M-Xmn512M
  • -XX:PermSize=256M-XX:MaxPermSize=256M 
  •  
  • -XX:MaxTenuringThreshold=7-XX:GCTimeRatio=19 
  •  
  • -Xnoclassgc-Xloggc:log/gc.log
  • -XX:+PrintGCDetails-XX:+PrintGCTimeStamps";  

这种配置一般在resin启动24小时内似乎没有大问题,网站可以正常访问,但查看日志发现,在接近24小时时,FullGC执行越来越频繁,大约每隔3分钟就有一次FullGC,每次FullGC系统会停顿6秒左右,作为一个网站来说,用户等待6秒恐怕太长了,所以这种方式有待改善。MaxTenuringThreshold=7表示一个对象如果在救助空间移动7次还没有被回收就放入年老代,GCTimeRatio=19表示java可以用5%的时间来做垃圾回收,1/(1+19)=1/20=5%。

 

二:JVM调优之并行回收

完成10万request用时117秒,配置如下: 

 

  • $JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server-Xmx2048M  
  • -Xms2048M-Xmn512M-XX:PermSize=256M-XX:MaxPermSize=256M 
  • -Xnoclassgc-Xloggc:log/gc.log-XX:+PrintGCDetails  
  • -XX:+PrintGCTimeStamps-XX:+UseParallelGC-XX:ParallelGCThreads=20 
  • -XX:+UseParallelOldGC-XX:MaxGCPauseMillis=500 
  • -XX:+UseAdaptiveSizePolicy-XX:MaxTenuringThreshold=7 
  • -XX:GCTimeRatio=19";  

 

并行回收我尝试过多种组合配置,似乎都没什么用,resin启动3小时左右就会停顿,时间超过10秒。也有可能是参数设置不够好的原因,MaxGCPauseMillis表示GC最大停顿时间,在resin刚启动还没有执行FullGC时系统是正常的,但一旦执行FullGC,MaxGCPauseMillis根本没有用,停顿时间可能超过20秒,之后会发生什么我也不再关心了,赶紧重启resin,尝试其他回收策略。

三:JVM调优之并发回收

完成10万request用时60秒,比并行回收差不多快一倍,是默认回收策略性能的2.5倍,配置如下: 

 

  • $JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server  
  • -Xms2048M-Xmx2048M-Xmn512M-XX:PermSize=256M 
  • -XX:MaxPermSize=256M-XX:+UseConcMarkSweepGC  
  • -XX:MaxTenuringThreshold=7-XX:GCTimeRatio=19 
  • -Xnoclassgc-Xloggc:log/gc.log-XX:+PrintGCDetails  
  • -XX:+PrintGCTimeStamps-XX:+UseCMSCompactAtFullCollection  
  • -XX:CMSFullGCsBeforeCompaction=0"; 

 

这个配置虽然不会出现10秒连不上的情况,但系统重启3个小时左右,每隔几分钟就会有5秒连不上的情况,查看gc.log,发现在执行ParNewGC时有个promotionfailed错误,从而转向执行FullGC,造成系统停顿,而且会很频繁,每隔几分钟就有一次,所以还得改善。UseCMSCompactAtFullCollection是表是执行FullGC后对内存进行整理压缩,免得产生内存碎片,CMSFullGCsBeforeCompaction=N表示执行N次FullGC后执行内存压缩。

JVM调优的几种策略(1)(2)

 

四:JVM调优之增量回收

完成10万request用时171秒,太慢了,配置如下: 

 

  • $JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server  
  • -Xms2048M-Xmx2048M-Xmn512M-XX:PermSize=256M 
  • -XX:MaxPermSize=256M-XX:MaxTenuringThreshold=7 
  • -XX:GCTimeRatio=19-Xnoclassgc-Xloggc:log/gc.log  
  • -XX:+PrintGCDetails-XX:+PrintGCTimeStamps-Xincgc"; 

 

似乎回收得也不太干净,而且也对性能有较大影响,不值得试。

五:JVM调优之并发回收的I-CMS模式

和增量回收差不多,完成10万request用时170秒。配置如下: 

 

  • $JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server  
  • -Xms2048M-Xmx2048M-Xmn512M-XX:PermSize=256M 
  • -XX:MaxPermSize=256M-XX:MaxTenuringThreshold=7 
  • -XX:GCTimeRatio=19-Xnoclassgc-Xloggc:log/gc.log  
  • -XX:+PrintGCDetails-XX:+PrintGCTimeStamps  
  • -XX:+UseConcMarkSweepGC-XX:+CMSIncrementalMode  
  • -XX:+CMSIncrementalPacing  
  • -XX:CMSIncrementalDutyCycleMin=0 
  • -XX:CMSIncrementalDutyCycle=10-XX:-TraceClassUnloading"; 

 

采用了sun推荐的参数,回收效果不好,照样有停顿,数小时之内就会频繁出现停顿,什么sun推荐的参数,照样不好使。

六:JVM调优之递增式低暂停收集器

又叫什么火车式回收,完成10万request用时153秒,配置如下: 

 

  • $JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server  
  • -Xms2048M-Xmx2048M-Xmn512M-XX:PermSize=256M 
  • -XX:MaxPermSize=256M-XX:MaxTenuringThreshold=7 
  • -XX:GCTimeRatio=19-Xnoclassgc-Xloggc:log/gc.log  
  • -XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+UseTrainGC"; 

 

该配置效果也不好,影响性能,所以没试。

七:相比之下,还是并发回收比较好,性能比较高,只要能解决ParNewGC(并行回收年轻代)时的promotionfailed错误就一切好办了,查了很多文章,发现引起promotionfailed错误的原因是CMS来不及回收(CMS默认在年老代占到90%左右才会执行),年老代又没有足够的空间供GC把一些活的对象从年轻代移到年老代,所以执行FullGC。CMSInitiatingOccupancyFraction=70表示年老代占到约70%时就开始执行CMS,这样就不会出现FullGC了。SoftRefLRUPolicyMSPerMB这个参数也是我认为比较有用的,官方解释是softlyreachableobjectswillremainaliveforsomeamountoftimeafterthelasttime
theywerereferenced.Thedefaultvalueisonesecondo
flifetimeperfreemegabyteintheheap,我觉得没必要等1秒,所以设置成0。配置如下

 

  • $JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server-Xms2048M  
  • -Xmx2048M-Xmn512M-XX:PermSize=256M-XX:MaxPermSize=256M 
  • -XX:SurvivorRatio=8-XX:MaxTenuringThreshold=7 
  • -XX:GCTimeRatio=19-Xnoclassgc-XX:+DisableExplicitGC  
  • -XX:+UseParNewGC-XX:+UseConcMarkSweepGC  
  • -XX:+CMSPermGenSweepingEnabled  
  • -XX:+UseCMSCompactAtFullCollection  
  • -XX:CMSFullGCsBeforeCompaction=0 
  • -XX:+CMSClassUnloadingEnabled-XX:-CMSParallelRemarkEnabled  
  • -XX:CMSInitiatingOccupancyFraction=70 
  • -XX:SoftRefLRUPolicyMSPerMB=0-XX:+PrintClassHistogram  
  • -XX:+PrintGCDetails-XX:+PrintGCTimeStamps  
  • -XX:+PrintGCApplicationConcurrentTime  
  • -XX:+PrintGCApplicationStoppedTime  
  • -Xloggc:log/gc.log"; 

 

上面这个配置内存上升的很慢,24小时之内几乎没有停顿现象,最长的只停滞了0.8s,ParNewGC每30秒左右才执行一次,每次回收约0.2秒,看来问题应该暂时解决了。

参数不明白的可以上网查,本人认为比较重要的几个参数是:

-Xms-Xmx-XmnMaxTenuringThresholdGCTimeRatioUse

ConcMarkSweepGCCMSInitiatingOccupancyFractionSoftRefLRUPolicyMSPerMB

eclipse中配置JVM参数:-Xmx1024M-Xms1000M-server-XX:PermSize=64M-XX:MaxPermSize=128m

 

 

分享到:
评论

相关推荐

    非常好用的java调优工具Jprofile

    Java性能优化是开发和运维过程中不可或缺的一环,而JProfiler是一款强大的Java调优工具,它提供了详尽的性能分析和内存管理功能,帮助开发者找出应用程序的瓶颈,提升系统效率。以下将详细介绍JProfiler的主要功能、...

    Java调优中一些概念的总结

    Java调优中一些概念的总结,如堆与栈,Java对象的大小,引用类型等

    阿里+Java+开发手册、阿里巴巴Java性能调优实战

    《阿里+Java+开发手册、阿里巴巴Java性能调优实战》是两本专注于Java开发和性能优化的专业书籍,分别以嵩山版和华山版的形式呈现,由阿里巴巴集团编写。这两本书籍结合了阿里巴巴在实际业务场景中的丰富经验,旨在...

    java性能调优的基本知识.pdf

    Java性能调优是提升应用程序效率的关键环节,尤其在大规模应用中更为重要。本文主要探讨了Java性能调优的基础知识,包括Java堆的管理和JDK调优策略。 Java堆是Java虚拟机(JVM)中用于存储对象的主要内存区域。它的...

    java性能调优及原理介绍.pdf

    Java性能调优主要聚焦在JVM的优化,其中包括内存模型的理解、垃圾收集(GC)机制以及如何处理常见的Out of Memory (OOM)异常。首先,我们要理解JVM的内存模型,这是进行性能调优的基础。 JVM内存模型由堆、栈、方法...

    阿里巴巴Java性能调优实战(2021华山版).pdf

    阿里巴巴Java性能调优实战

    78-Java性能调优实战.zip

    78-Java性能调优实战.zip78-Java性能调优实战.zip78-Java性能调优实战.zip78-Java性能调优实战.zip78-Java性能调优实战.zip78-Java性能调优实战.zip78-Java性能调优实战.zip78-Java性能调优实战.zip78-Java性能调优...

    阿里巴巴Java性能调优实战(2021华山版)

    阿里巴巴Java性能调优实战(2021华山版) 本资源摘要信息来自阿里巴巴Java性能调优实战(2021华山版),旨在帮助Java开发者掌握性能调优的实战经验和技术。 性能调优的重要性 性能调优是软件开发中一个非常重要的...

    Java调优入门: 选择编译器类型.pdf

    同时,持续关注JVM的性能监控,例如使用JMX、VisualVM等工具,可以帮助开发者更好地理解编译器的工作方式,并据此进行调优。 总之,理解Java的编译器类型及其工作原理,是进行性能优化的关键步骤。选择正确的编译器...

    Java性能调优命令

    在Java应用程序的性能调优过程中,掌握一系列命令行工具是至关重要的。这些工具可以帮助开发者监控应用程序的运行状态,诊断性能瓶颈,并对JVM进行调优。以下是一些常用的Java性能调优命令及其用法和相关知识点。 1...

    Java性能调优工具简介

    Java性能调优工具简介,包括Linux系统层面的调优工具介绍和java层面调优的工具介绍

    Java 性能调优 Java 性能调优

    Java 性能调优 Java 性能调优

    阿里巴巴java性能调优实战手册

    "阿里巴巴java性能调优实战手册" 本手册旨在为Java开发者提供一份实践性的性能调优指南,帮助他们解决在实际项目中遇到的性能问题。作者通过自己的经验和实践,总结了Java性能调优的重要性和必要性,并分享了自己的...

    Java性能调优PPT

    ### Java性能调优知识点概述 #### 一、高性能Java代码编写原则 - **算法与数据结构**:选择合适的数据结构可以极大地提升程序运行效率。例如,对于查找操作频繁的场景,哈希表(如`HashMap`)比链表或数组更高效。...

    Java 性能调优 Java 性能调优 Java 性能调优

    ### Java性能调优概述 #### 一、性能优化的重要性与基本概念 在现代软件开发中,性能优化是一项至关重要的任务。对于Java开发者来说,优化不仅仅意味着让程序运行更快,还包括了减少内存消耗、提高响应速度等多个...

    阿里巴巴Java性能调优实战(2021-2022华山版)+Java架构核心宝典+性能优化手册100技巧.rar

    阿里巴巴Java性能调优华山版是一套系统性能调优教程,!通过这份笔记的学习,你将会有一个系统的调优头脑和策略!快了何止100%?需要的朋友可下载试试! 众所周知性能调优可以使系统稳定,用户体验更佳,甚至在...

    Java性能调优大全

    Java性能调优是一个复杂而重要的领域,涉及到程序的运行效率、资源消耗以及系统的稳定性。这份“Java性能调优大全”提供了全面的指南,包括VisualVM的使用、JVM的性能优化、OMM(可能是指Oracle Management Monitor...

    Java性能调优 6步实现项目性能全面升级+面试高频性能问题讲解.rar

    Java性能调优 6步实现项目性能全面升级+面试高频性能问题讲解视频教程分享,性能优化的N种企业级解决方案,囊括了【数据库优化】、【Tomcat优化】、【JVM优化】、【垃圾回收】、【Netty优化】、【Nginx优化】、...

    阿里巴巴Java性能调优实战(2021华山版).docx

    6. Java性能调优:Java性能调优包括Java编程性能调优、多线程性能调优、JVM性能监测及调优、设计模式调优和数据库性能调优等。 7. Java编程性能调优:Java编程性能调优包括基础数据类型、容器调优和网络通信调优等。...

    java性能调优

    java 性能调优, 来自于内部分享。 java 性能调优, 来自于内部分享。

Global site tag (gtag.js) - Google Analytics