`

【2015工作总结】JVM监控总结

 
阅读更多

一。讲解JVM结构



 

其中,

新生代是Heap,包括Eden(伊甸园)+S0(幸存0)+S1(幸存1):新建对象都存储在这里。配置参数是Xms。

老生代是Old,存放从新生代迁移过来的生命周期较久的对象。新生代和老生代共同组成了堆内存。配置参数是Xmx减去Xmn。

永久代是Perm,是非堆内存的组成部分。存放加载的Class类级对象如class本身,method,field等。

 

二。一般程序内存溢出分析:

 

如果出现java.lang.OutOfMemoryError: Java heap space异常,说明Java虚拟机的堆内存不够。原因有二:

 

(1)Java虚拟机的堆内存设置不够,可以通过参数-Xms、-Xmx来调整。

 

(2)代码中创建了大量大对象,并且长时间不能被垃圾收集器收集(存在被引用)。

 

如果出现java.lang.OutOfMemoryError: PermGen space,说明是Java虚拟机对永久代Perm内存设置不够。

 

一般出现这种情况,都是程序启动需要加载大量的第三方jar包。例如:在一个Tomcat下部署了太多的应用。

 

三。具体JVM监控方法:

 

使用JDK1.7自带的jvisualvm.exe工具,文件路径:..\Java\jdk1.7.0_67\bin\jvisualvm.exe

 

需要操作以下几个步骤:

 

3.1修改服务器tomcat的catalina.sh,路径是.../tomcat/bin/catalina.sh(黄色是添加的)

 

JAVA_OPTS="$JAVA_OPTS  -server -Xms${xms_size} -Xmx${xmx_size}  -XX:PermSize=512m -XX:MaxNewSize=1024m -XX:MaxPermSize=512m -Djava.awt.headless=true -Dfile.encoding=utf-8 -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=19999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

 

 

3.2添加服务器的应用列表

 

先创建一个java.policy文件:

 

grant codebase "file:${java.home}/../lib/tools.jar" {  
   permission java.security.AllPermission;  
};  

 

 

放在服务器某个位置,比如我放在JDK1.7的bin路径下,进入对应路径,执行以下命令:

 

jstatd -J-Djava.security.policy=java.policy -J-Djava.rmi.server.logCalls=true

 

 

3.3然后在本地打开jvisualvm.exe,安装完GC插件,就可以看到某个端口的应用JVM监控了。

 

四。简单介绍JVM的其他知识:

 

4.1 高并发下 JVM占用TOP100 (假设进程号19771):jmap -histo:live 19771 | head -n 100 

 

开发可以从中分析哪些代码存在不断实例,不断增大,且没有释放的问题。

 

4.2 内存申请过程

4.2.1 JVM会试图为相关Java对象在Eden中初始化一块内存区域;

4.2.2当Eden空间足够时,内存申请结束。否则到下一步;

4.2.3JVM试图释放在Eden中所有不活跃的对象(minor collection),释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区;

4.2.4.Survivor区被用来作为Eden及old的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区;

4.2.5当old区空间不够时,JVM会在old区进行major collection;

4.2.6完全垃圾收集后,若Survivor及old区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现"Out of memory错误"。

 

4.3 GC

JVM有2个GC线程:

第一个线程负责回收Heap的新生代区

第二个线程在Heap不足时,遍历Heap,将新生代区升级为老生代区

 

堆内存GC:JVM(采用分代回收的策略),用较高的频率对年轻的对象(young generation)进行YGC,而对老对象(tenured generation)较少(tenured generation 满了后才进行)进行Full GC。这样就不需要每次GC都将内存中所有对象都检查一遍。

 

非堆内存不GC:GC不会在主程序运行期对PermGen Space进行清理,所以如果你的应用中有很多CLASS(特别是动态生成类,当然permgen space存放的内容不仅限于类)的话,就很可能出现PermGen Space错误。

 

监视JVM GC:可以用JDK中的jstat工具,也可以在java程序启动的opt里加上如下几个参数(注:这两个参数只针对SUN的HotSpotVM)

[java] view plaincopy
-XX:-PrintGCPrintmessagesatgarbagecollection.Manageable.    
-XX:-PrintGCDetailsPrintmoredetailsatgarbagecollection.Manageable.(Introducedin1.4.0.)    
-XX:-PrintGCTimeStampsPrinttimestampsatgarbagecollection.Manageable(Introducedin1.4.0.)   
[java] view plain copy
-XX:-PrintGCPrintmessagesatgarbagecollection.Manageable.    
-XX:-PrintGCDetailsPrintmoredetailsatgarbagecollection.Manageable.(Introducedin1.4.0.)    
-XX:-PrintGCTimeStampsPrinttimestampsatgarbagecollection.Manageable(Introducedin1.4.0.) 

 当把-XX:-PrintGCDetails加入到javaopt里以后可以看见如下输出:

[GC[DefNew:34538K->2311K(36352K),0.0232439secs]45898K->15874K(520320K),0.0233874secs]

[FullGC[Tenured:13563K->15402K(483968K),0.2368177secs]21163K->15402K(520320K),[Perm:28671K->28635K(28672K)],0.2371537secs]

 

他们分别显示了JVM GC的过程,清理出了多少空间。第一行GC使用的是‘普通GC’(MinorCollections),第二行使用的是‘全GC’(MajorCollections)。他们的区别很大,在第一行最后我们可以看见他的时间是0.0233874秒,而第二行的FullGC的时间是0.2371537秒。第二行的时间是第一行的接近10倍,也就是我们这次调优的重点,减少FullGC的次数,以为FullGC会暂停程序比较长的时间,如果FullGC的次数比较多。程序就会经常性的假死。

  • 大小: 59.8 KB
分享到:
评论

相关推荐

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 112 5.2.5 服务器JVM进程崩溃 / 113 5.3 实战:Eclipse运行速度调优 / 114 5.3.1 调优前的程序运行状态 / 114 5.3.2 升级JDK 1.6的性能变化及兼容问题 / 117 5.3.3 编译时间和类加载时间的优化 / 122 5.3.4 ...

    Hadoop权威指南(中文版)2015上传.rar

    重用JVM 跳过坏记录 任务执行环境 第7章 MapReduce的类型与格式 MapReduce的类型 默认的MapReduce作业 输入格式 输入分片与记录 文本输入 二进制输入 多种输入 数据库输入(和输出) 输出格式 文本输出 二进制输出 ...

    JAVA 内存管理总结

    但同时,它也加重了JVM的工作。因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。  2. 什么叫java的内存泄露  在Java中,内存泄漏是...

    java 面试题 总结

    sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程...

    Java虚拟机

    全书共分为五大部分,围绕内存管理、执行子系统、程序编译与优化、高效并发等核心主题对JVM进行了全面而深入的分析,深刻揭示了JVM的工作原理。第一部分从宏观的角度介绍了整个Java技术体系、Java和JVM的发展历程、...

    activemq服务无法正常启动.docx

    3. JMX Management:ActiveMQ 支持 JMX 管理,允许用户通过 JMX 客户端来监控和管理 ActiveMQ 服务。 4. TCP 端口占用:在上面的错误信息中,我们可以看到 TCP 端口 61616 已经被其他进程占用。因此,在实际使用中,...

    HIS软件开发岗位职责.docx

    本节将对 HIS 软件开发岗位职责进行详细的知识点总结,从四个不同岗位职责中提炼出关键的技术要点和職責要求。 软件开发工程师(HIS 或集成平台领域) * 任职要求: + 大学本科及以上学历 + Java 开发经验 2 年...

    java源码编辑-drools:Drools是用Java语言编写的开放源码规则引擎,使用Rete算法对所编写的规则求值。Drools允许使用声

    相关技术栈的总结记录,在这里也希望能帮助一些在学习 Java 过程中遇到问题的小伙伴,如果您需要转载本仓库的一些文章到自己的博客,请按照以下格式注明出处,谢谢合作。 作者:小傅哥 链接:https://bugstack

    Hadoop权威指南 第二版(中文版)

     重用JVM  跳过坏记录  任务执行环境 第7章 MapReduce的类型与格式  MapReduce的类型  默认的MapReduce作业  输入格式  输入分片与记录  文本输入  二进制输入  多种输入  数据库输入(和输出)  输出格式...

    测试培训教材

     -测试总结和报告。 一个好的测试管理工具应该能把以上几个阶段都管理起来。 测试人员每时每刻都在度量别人的工作成果,而测试人员的工作成果又由谁来度量呢?度量的标准和依据是什么呢?软件测试的度量是测试...

Global site tag (gtag.js) - Google Analytics