您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
如何合理的规划一次jvm性能调优?
内存,性能,应用程序如何合理的规划一次jvm性能调优?
发布时间:2019-02-08加入收藏来源:互联网点击:
如何合理的规划一次jvm性能调优?
回答于 2019-09-11 08:43:50
回答于 2019-09-11 08:43:50
很多同学觉得JVM调优就是简单调整几个JVM内存几个参数,我认为这个观点是非常片面的。JVM调优有很多门槛,不只是修改几个参数那个简单。
其实我想回答如何进行JVM调优,但是可能和题主的问题稍微有些出入。但是我想通过我对JVM的理解帮助到更多这方面知识欠缺的童鞋。
关注必回!
我认为JVM调优可以从以下几个方面考虑:
对JVM内存模型有一定认识是能够对JVM调优的基本门槛,下面我简单介绍一下jvm内存模型,对这部分知识还有不明确的可以阅读我jvm详解的文章。
jvm内存可以简单分为堆,栈和元空间。题主的调优主要针对堆内存,当然也有栈。但是前者居多。jvm的精明之处!垃圾回收机制,jvm根据内存使用情况,根据引用计数法和根目录遍历的方式结合age对堆内对象的生命周期进行管理,当然因为一个对象的创建在堆栈中都分配内存空间(引用在栈中,对象本身在堆中),所以垃圾回收机制对堆和栈都效果!分代垃圾回收机制,通过分代更合理的掌控对象的生命周期。根据业务需要合理的进行GC以达到最优内存使用率。分析JVM内存的增长因子,快速定位大块老赖对象
如果在程序运行期间,内存突然上升,并且在一定时间没有下降趋势,那么说明,有一大波对象逃过了垃圾回收,我们都知道,新生代垃圾回收是频繁的,但是新生代内存空间有限,内存持续上升,说明大部分对象已经进入老年带,根据引用计数和不可达算法,快速定位问题,留意近期的哪些改动会产生大量持续被引用对象,或者仅仅是持续产生大量对象,因为gc往往是阻塞的,短时间内gc掉大量对象对应用程序也会造成伤害,倒置线程长时间等待以致假死。
在这个时候猜测往往是效率最高的解决方案!大胆的预测问题并去验证它。如果猜测短时间内没有定位问题,那么通过top命令查找线程一步一步的找吧,也很快的,因为手机码字,这块儿就不细说了,有不清楚的私信!
JAVA虚拟机启动过程监控。
一个项目启动是JVM会将用到的类文件加载进内存,加载所有配置,加载所有bean对象。在这个过程中内存是不断增加的,可以通过jvm-
monitor.sh
。想了解JVM虚拟机启动的可以先看看自己公司项目的启动日志,可窥一二。
脚本进行内存监控,具体脚本内容比较冗长,在问答中不便贴出来了,有需要的童鞋直接私信我。
调整JVM堆栈内存分配大小,合理规避业务中内存溢出等问题
理论不多说,直接给出结论:
堆内存中,老年代:新生代比例=2:1;
新生代中,Eden:SurvivorA:SurvivorB=8:1:1;
-Xms:初始化堆大小;Xmx:最大堆大小;
-XX:NewSize=x,设置年轻代大小;-XX NewRatio=x 年轻代和老年代比例。
JVM调优工具的使用,快速定位内存问题利器
遇到
1、java.lang.OutOfMemoryError: PermGen space
2、java.lang.OutOfMemoryError: Java heap space 两种异常,通过大胆猜测未能解决问题的,可以通过LInux命令查找到问题代码块。常用命令简单整理如下(需要实战的可以私信我):
top,通过top命令,快速定位占用内存较大的java进程。
jmap -histo:live [pid] ,查看当前java进程中活跃对象的数目和占用内存大小。
jmap -dump:live,format=b,file=xxx.xxx [pid] 导出指定pid的java进程的内存占用情况,以便通过内存分析工具进行分析,具体的内存分析工具包括HeapSnapShot、HeapViewer、MAT等。门槛都不高,能够帮助我们快速定位出问题症结。
java本身也提供好几款内存监控分析插件,位于jdk的bin目录下:具体使用方法本人多年前在csdn上有文章详解,这里不允许贴链接,也就不多说了。
本人从事软件工作多年,一路走来也不断积累不断学习,整理了一些java开发相关的资料,也包含JVM调优,需要的可以在下方留言或者留下邮箱(不是圈粉,所以可以不用关注)。
我是狂客说技术,总想着把自己掌握的东西整理一下分享出来,怎奈时间有限,可能文中也有不当的地方,欢迎大家指出,也欢迎大家点我关注。
回答于 2019-09-11 08:43:50
JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响。但也有一些基础的理论和原则,理解这些理论并遵循这些原则会让你的性能调优任务将会更加轻松。为了更好的理解本篇所介绍的内容。你需要已经了解和遵循以下内容:
1、已了解jvm 垃圾收集器2、已了解jvm 性能监控常用工具3、能够读懂gc日志4、确信不为了调优而调优,jvm调优不能解决一切性能问题
如果对这些不了解不建议读本篇文章。
本篇文章基于jvm性能调优,结合jvm的各项参数对应用程序调优,主要内容有以下几个方面:
1、jvm调优的一般流程2、jvm调优所要关注的几个性能指标3、jvm调优需要掌握的一些原则4、调优策略&示例
一、性能调优的层次
为了提升系统性能,我们需要对系统的各个角度和层次来进行优化,以下是需要优化的几个层次。
从上面我们可以看到,除了jvm调优以外,还有其他几个层面需要来处理,所以针对系统的调优不是只有jvm调优一项,而是需要针对系统来整体调优,才能提升系统的性能。本篇只针对jvm调优来讲解,其他几个方面,后续再介绍。
在进行jvm调优之前,我们假设项目的架构调优和代码调优已经进行过或者是针对当前项目是最优的。这两个是jvm调优的基础,并且架构调优是对系统影响最大的 ,我们不能指望一个系统架构有缺陷或者代码层次优化没有穷尽的应用,通过jvm调优令其达到一个质的飞跃,这是不可能的。
另外,在调优之前,必须得有明确的性能优化目标, 然后找到其性能瓶颈。之后针对瓶颈的优化,还需要对应用进行压力和基准测试,通过各种监控和统计工具,确认调优后的应用是否已经达到相关目标。
二、jvm调优流程
调优的最终目的都是为了令应用程序使用最小的硬件消耗来承载更大的吞吐。jvm的调优也不例外,jvm调优主要是针对垃圾收集器的收集性能优化,令运行在虚拟机上的应用能够使用更少的内存以及延迟获取更大的吞吐量。当然这里的最少是最优的选择,而不是越少越好。
上一篇:如何拯救不知感恩的自己呢?
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |