JVM调优

简介: 在了解JVM调优之前,我们先了解下java的内存管理:http://blog.csdn.net/cymm_liu/article/details/7759696 基于Java的应用最大的问题莫过于出现Out Of Memory Error(内存溢出错误),通常出现OOME问题的应用都会有以下一些表现:l         Jvm crashl         性能奇差l         Jvm似乎在不断的进行垃圾回收收集,这通常致使程序停止运行甚至服务崩溃 而且一旦出现这种情况,一般都需要重新启动应用服务器。
在了解JVM调优之前,我们先了解下java的内存管理:http://blog.csdn.net/cymm_liu/article/details/7759696
基于Java的应用最大的问题莫过于出现Out Of Memory Error(内存溢出错误),通常出现OOME问题的应用都会有以下一些表现:
l         Jvm crash
l         性能奇差
l         Jvm似乎在不断的进行垃圾回收收集,这通常致使程序停止运行甚至服务崩溃
 
而且一旦出现这种情况,一般都需要重新启动应用服务器。
 
OutOfMemoryError
如果JVM里运行的程序, 它的heap space和perm gen都满了,这个时候程序还企图创建新的对象实例的话,jvm gc就会启动,试图释放足够的内存来创建这个对象。这个时候如果gc无法释放出足够的内存,它就会抛出OutOfMemoryError内存溢出错误。
OutOfMemoryError通常是java内存泄漏引起的。内存泄漏的原因是一个对象虽然不被使用了,但是依然还有对象引用它,因此jvm gc就不会释放它所占据的内存,堆中也就少了块可用的空间。
通常解决这类问题需要从以下两个方面着手:
l         分析内存数据
l         观察堆的增长方式
 
GC工作机制
SUN的jvm内存池被划分为以下几个部分:
Eden Space (heap)——内存最初从这个线程池分配给大部分对象。
 
Survivor Space (heap)——用于保存在eden space内存池中经过垃圾回收后没有被回收的对象。
 
Tenured Generation (heap)——用于保持已经在survivor space内存池中存在了一段时间的对象。
 
Permanent Generation (non-heap)——保存虚拟机自己的静态(reflective)数据,例如类(class)和方法(method)对象。Java虚拟机共享这些类数据。这个区域被分割为只读的和只写的。
 
Code Cache (non-heap)——HotSpot Java虚拟机包括一个用于编译和保存本地代码(native code)的内存,叫做“代码缓存区”(code cache)。
 
简单来讲,jvm的内存回收过程是这样的:
对象在Eden Space创建,当Eden Space满了的时候,gc就把所有在Eden Space中的对象扫描一次,把所有有效的对象复制到第一个Survivor Space,同时把无效的对象所占用的空间释放。当Eden Space再次变满了的时候,就启动移动程序把Eden Space中有效的对象复制到第二个Survivor Space,同时,也将第一个Survivor Space中的有效对象复制到第二个Survivor Space。如果填充到第二个Survivor Space中的有效对象被第一个Survivor Space或Eden Space中的对象引用,那么这些对象就是长期存在的,此时这些对象将被复制到Permanent Generation。
若垃圾收集器依据这种小幅度的调整收集不能腾出足够的空间,就会运行Full GC,此时jvm gc停止所有在堆中运行的线程并执行清除动作。
JVM Tuning 工具
下面是整理的一份JVM调优工具介绍,重点介绍几个关键的:
jps
http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html
jps使用很简单,在console输入jps即可,它是用来查看JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。
 
jconsole
http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html
jconsole是基于Java Management Extensions (JMX)的实时图形化监测工具,它利用了内建到JVM里面的JMX指令来提供实时的性能和资源的监控,包括了Java程序的内存使用,Heap size, 线程的状态,类的分配状态和空间使用等等。
注意:JBoss 4.0.2及以下版本不支持jconsole,在国际站测试过程中遇到了这个问题,查了JBoss JIRA才知道4.0.2版本的JMX实现并不标准。。。
 
jstat
http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html
jstat利用了JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控等等。它包含了以下几个options,能够对gc情况进行详细的监控:
-class
-compiler
-gc
-gccapacity
-gccause
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcpermcapacity
-gcutil
-printcompilation
 
我们常用的命令如:
 
jstat -gcutil -t -h10 $jvmpid 1s > _jvmstat_$jvmpid.$now.log &
 
它表示监控jvm gc状态,每秒钟刷新一次。每10次显示一次表头。
这是一个非常实用的工具,对我们jvm的gc状态和监控非常有帮助。对于希望远程监控jvm状态的人,则jstatd比较有用了。
 
jstatd
http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstatd.html
       jstatd是jstat的守护进程,它能够提供远程jstat功能。使用它的服务需要设置security policy,一种方式是修改${java.home}/jre/lib/security/java.policy文件,在最后加入:
 
grant codebase "file:${java.home}/../lib/tools.jar" {
        permission java.security.AllPermission;
};
 
又或者,定义jstatd.policy文件,加入上面的策略,然后用如下脚本启动jstatd:
jstatd -J-Djava.security.policy=jstatd.policy
 
远程的监控命令:
jstat pid@hostip interval
如:
jstat 1234@127.0.0.1 1000
 
此时会监控127.0.0.1机器上进程id为1234的jvm gc情况,间隔1秒。
 
还有几个:
jstack
http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstack.html
jstack工具可以用来获得java程序崩溃生成的core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息,如果现在运行的java程序呈现挂起的情况,jstack是非常有用的。
目前只有在Solaris和Linux的JDK版本里面才有。
 
jinfo
http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jinfo.html
jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息。目前只有在Solaris和Linux的JDK版本里面才有。
 
jmap
http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jmap.html
jmap可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等等。目前只有在Solaris和Linux的JDK版本里面才有。
 
JVM调优参数
       JVM提供了很多调优参数,在此次调优过程中,我们发现采用以下几个jvm参数会使jvm变得非常稳定,这也是sun官方提供的生产环境调优参数,在sun的很多产品调优脚本中都可以看到这几个参数设置。
标准的JVM GC回收器不会回收Permanent Generation,但JVM提供了并发GC回收器来实现,首先我们要指定回收机制:
 
-XX:+UseConcMarkSweepGC
 
该参数适用于多核并存在缓存机制的应用中。它生成的gc回收曲线变化相比较并行GC而言更加平滑稳定。详细的参数说明可以参考sun的官方文档。
上面的参数是第一步,下一个参数告诉GC回收器能够操作Permanent Generation:
 
-XX:+CMSPermGenSweepingEnabled
 
而GC回收器是不会操作Classes的,这时候我们可以指定以下参数可以使得jvm能够unload class:
XX:+CMSClassUnloadingEnabled
相关文章
|
17天前
|
存储 监控 算法
jvm-性能调优(二)
jvm-性能调优(二)
|
3月前
|
Arthas 监控 Java
(十一)JVM成神路之性能调优篇:GC调优、Arthas工具详解及各场景下线上最佳配置推荐
“在当前的互联网开发模式下,系统访问量日涨、并发暴增、线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代开发过程中炙手可热的名词,无论是在开发、面试过程中,性能优化都是一个常谈常新的话题”。
251 3
|
3月前
|
监控 Java 测试技术
JVM 性能调优 及 为什么要减少 Full GC
JVM 性能调优 及 为什么要减少 Full GC
94 4
|
4月前
|
监控 Java 调度
探秘Java虚拟机(JVM)性能调优:技术要点与实战策略
【6月更文挑战第30天】**探索JVM性能调优:**关注堆内存配置(Xms, Xmx, XX:NewRatio, XX:SurvivorRatio),选择适合的垃圾收集器(如Parallel, CMS, G1),利用jstat, jmap等工具诊断,解决Full GC问题,实战中结合MAT分析内存泄露。调优是平衡内存占用、延迟和吞吐量的艺术,借助VisualVM等工具提升系统在高负载下的稳定性与效率。
91 1
|
4月前
|
监控 Java 测试技术
Java中的JVM调优技巧
Java中的JVM调优技巧
|
18天前
|
Kubernetes Java 编译器
解锁极致性能:Quarkus如何让JVM应用调优变得前所未有的简单与高效!
Quarkus是一款专为GraalVM和OpenJDK设计的Kubernetes Native Java框架,采用AOT编译技术将Java应用转化为本地代码,大幅提升启动速度与运行效率。它简化了性能调优流程,如自动优化垃圾回收、类加载、内存管理及线程管理等,使开发者无需深入理解JVM细节即可轻松提升应用性能。与传统JVM应用相比,Quarkus显著降低了性能调优的复杂度。
56 2
|
2天前
|
前端开发 Java 应用服务中间件
JVM进阶调优系列(1)类加载器原理一文讲透
本文详细介绍了JVM类加载机制。首先解释了类加载器的概念及其工作原理,接着阐述了四种类型的类加载器:启动类加载器、扩展类加载器、应用类加载器及用户自定义类加载器。文中重点讲解了双亲委派机制,包括其优点和缺点,并探讨了打破这一机制的方法。最后,通过Tomcat的实际应用示例,展示了如何通过自定义类加载器打破双亲委派机制,实现应用间的隔离。
|
3月前
|
运维 Java Linux
(九)JVM成神路之性能调优、GC调试、各内存区、Linux参数大全及实用小技巧
本章节主要用于补齐之前GC篇章以及JVM运行时数据区的一些JVM参数,更多的作用也可以看作是JVM的参数列表大全。对于开发者而言,能够控制JVM的部分也就只有启动参数了,同时,对于JVM的性能调优而言,JVM的参数也是基础。
|
3月前
|
缓存 监控 Java
Java虚拟机(JVM)性能调优实战指南
在追求软件开发卓越的征途中,Java虚拟机(JVM)性能调优是一个不可或缺的环节。本文将通过具体的数据和案例,深入探讨JVM性能调优的理论基础与实践技巧,旨在为广大Java开发者提供一套系统化的性能优化方案。文章首先剖析了JVM内存管理机制的工作原理,然后通过对比分析不同垃圾收集器的适用场景及性能表现,为读者揭示了选择合适垃圾回收策略的数据支持。接下来,结合线程管理和JIT编译优化等高级话题,文章详细阐述了如何利用现代JVM提供的丰富工具进行问题诊断和性能监控。最后,通过实际案例分析,展示了性能调优过程中可能遇到的挑战及应对策略,确保读者能够将理论运用于实践,有效提升Java应用的性能。 【
170 10
|
3月前
|
监控 算法 Java
深入理解Java虚拟机:JVM调优的实用策略
在Java应用开发中,性能优化常常成为提升系统响应速度和处理能力的关键。本文将探讨Java虚拟机(JVM)调优的核心概念,包括垃圾回收、内存管理和编译器优化等方面,并提供一系列经过验证的调优技巧。通过这些实践指导,开发人员可以有效减少延迟,提高吞吐量,确保应用稳定运行。 【7月更文挑战第16天】