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.htmljps使用很简单,在console输入jps即可,它是用来查看JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。
 
jconsole
http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.htmljconsole是基于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.htmljstat利用了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.htmljstack工具可以用来获得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.htmljinfo可以从core文件里面知道崩溃的Java应用程序的配置信息。目前只有在Solaris和Linux的JDK版本里面才有。
 
jmap
http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jmap.htmljmap可以从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
时间: 2024-08-08 14:34:13

JVM调优的相关文章

JVM调优总结(十)-调优方法

JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回收算法有很详细的跟踪.详细说明参考这里 JProfiler:商业软件,需要付费.功能强大.详细说明参考这里 VisualVM:JDK自带,功能强大,与JProfiler类似.推荐. 如何调优 观察内存释放情况.集合类检查.对象树 上面这些调优工具都提供了强大的功能,但是总的来说一般分为以下几类功能 堆信息查看 可查看堆空间大小分配(年轻代

JVM调优的几种策略(转)

    JVM参数调优是一个很头痛的问题,可能和应用有关系,别人说可以的对自己不一定管用.下面是本人一些JVM调优的实践经验,希望对读者能有帮助,环境LinuxAS4,resin2.1.17,JDK6.0,2CPU,4G内存,dell2950服务器.        JVM调优        一:JVM调优之串行垃圾回收        也就是默认配置,完成10万request用时153秒.JVM参数配置如下:        $JAVA_ARGS.="-Dresin.home=$SERVER_ROO

jvm系列(七):jvm调优-工具篇

16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化.工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相关问题,长长可以到达事半功倍的效果来. jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具.jdk自带工具一般在jdk bin目录下面,

《Java程序性能优化》学习笔记 JVM调优

第五章 JVM调优5.1 Java虚拟机内存模型 1.JVM虚拟机将其内存数据分为程序计数器.虚拟机栈,本地方法栈,Java堆,和方法去等部分. 2.Java虚拟机栈,在Java 虚拟机规范中,定义了两种异常与占空间相关,即StackOverError和OutOfMemoryError.如果线程在计算过程中,请求的栈深度大于最大可用的栈深度,则抛出SOE,如果Java栈可以动态扩展,而在扩展栈的过程中,没有足够的内存空间来支持栈的扩展,则抛出OutOfMemoryError. 栈的大小直接决定了

JVM调优浅谈

[本文转载自JVM调优浅谈] 1.数据类型     java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:它代表的值就是数值本身,而引用类型的变量保存引用值."引用值"代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置.     基本类型包括:byte.short.int.long.char.float.double.boolean.returnAddress     引用类型包括:类类型.接口类型和数组 2.堆与栈  

jvm 调优-JVM调优问题,请大神指教

问题描述 JVM调优问题,请大神指教 JVM调优是针对 jdk调优 还是 容器 像tomcat调优 具体怎么手动修改jvm的队内存,栈内存,新生代,老年代和持久带,具体在配置 比如说我安装了一个jdk6的环境变量也配置好了,具体怎么弄

基于JVM 调优的技巧总结分析_java

这篇是技巧性的文章,如果要找关于GC或者调整内纯的文章,看我其他几篇文章.因为是JVM 调优总结,所以废话少说.从各方面一共收集到以下几个方法:1.升级 JVM 版本.如果能使用64-bit,使用64-bit JVM.    基本上没什么好解释的,很简单将JVM升级到最新的版本.如果你还是使用JDK1.4甚至是更早的JVM,那你首先要做的就是升级.因为JVM从1.4- >1.5->1.6可不是仅仅的版本号升级,或者仅仅往里面加了一堆新的语言特性,这么简单.而是真正在JVM做了重大的改进,每次版

jvm系列(四):jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)

文章同步发布于github博客地址,阅读效果更佳,欢迎品尝 运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole.大名鼎鼎的VisualVM,IBM的Memory Analyzer等等,但是在生产环境出现问题的时候,一方面工具的使用会有所限制,另一方面喜欢装X的我们,总喜欢在出现问题的时候在终端输入一些命令来解决.所有的工具几乎都是依赖于jdk的接口和底层的这些命令,研究这些命令的使用也让我们更能了解jvm构成和特性

JVM调优总结

一.堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~2G:64为操作系统对内存无限制.我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m.典型设置: java -Xmx3550m-Xms3550m -Xmn2g -Xss128k -Xmx3550m:设置JVM最大可用内存为3550M. -Xms355