一。讲解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的次数比较多。程序就会经常性的假死。
相关推荐
### JAVA JVM性能调优监控工具详解 在Java开发过程中,特别是在企业级应用中,经常会遇到各种性能瓶颈问题,如内存溢出(`OutOfMemoryError`)、内存泄露、线程死锁、锁争用等问题。这些问题如果不能及时有效地解决...
JVM虚拟机调优是一个深度探索Java...总之,JVM调优是一个综合性的任务,需要深入理解JVM的工作原理,结合实际应用中的性能瓶颈,合理调整配置,以实现最佳的运行效果。在这个过程中,不断学习和实践是提升技能的关键。
### 个人总结之—JVM性能调优实战 #### 概述 本文档是一篇关于JVM(Java虚拟机)性能调优的经典实战总结。在实际应用开发与维护过程中,JVM性能调优是一个非常重要的话题,它直接关系到应用程序运行效率、资源利用...
《vjtop:深入理解JVM监控利器》 vjtop是一款强大的命令行工具,专用于实时监控Java虚拟机(JVM)的状态,它可以帮助开发者和运维人员深入理解JVM的运行情况,有效地定位性能问题。本篇文章将详细解析vjtop的核心...
总结以上内容,Zabbix监控多个JVM进程的过程可以分为以下几个步骤: 1. 准备环境,包括安装JDK、配置环境变量、上传并测试jvm.py脚本。 2. 安装和配置Zabbix Agent,确保它能正确收集和传输监控数据。 3. 在Zabbix ...
JVM提供了丰富的工具,如JConsole、VisualVM、JProfiler等,用于监控JVM的状态、分析性能、诊断问题等。开发者可以借助这些工具深入了解JVM运行情况并进行调优。 总结来说,JVM是一个复杂的系统,它的核心任务是...
1. JMX(Java Management Extensions):提供管理和监控JVM的工具,可以查看运行时的内存、线程、类装载情况等。 2. jstat:命令行工具,用于收集JVM的各种统计信息,如垃圾收集、类装载、内存使用等。 3. ...
JVM 调优是一项复杂但至关重要的工作,它涉及到对 JVM 内部机制的理解以及实际应用场景的分析。通过合理设置 JVM 参数、选择合适的 GC 算法、优化代码逻辑等方式,可以显著提升 Java 应用的性能表现。同时,利用各种...
### JVM结构与工作原理 JVM主要由以下几个部分组成: 1. **类加载器(ClassLoader)**:负责加载.class文件,将字节码转换为内存中的类。 2. **运行时数据区(Runtime Data Area)**:包括方法区、堆、栈、本地方法...
1. JVisualVM:JDK自带的轻量级工具,提供丰富的JVM监控功能,包括线程、堆内存、类加载、Garbage Collector、JMX等信息。 2. JConsole:同样是JDK自带的工具,提供GUI界面,可监控JVM的性能和诊断问题。 3. ...
通过理解JVM工作原理,使用合适的工具进行监控和分析,结合代码优化,可以有效提升程序性能。 9. **参考文献**: - 学习更多关于JVM、Java性能调优的书籍和在线资源,如《Java性能优化权威指南》等。 总之,JVM...
Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。...同时,利用各种监控工具,如VisualVM、JConsole等,可以实时查看JVM的状态,辅助进行性能分析和调优。
总结起来,Uber的JVM Profiler是一款强大的性能监控工具,尤其适用于Hadoop和Spark等大数据处理场景。通过实时收集和分析JVM的各类度量,它可以帮助开发者优化系统性能,提升整体效率,同时,其开放源码的特性也为...
Java虚拟机(JVM)是Java程序运行的核心组件,它负责解释执行字节码并管理内存。本篇文章将深入探讨JVM的一些常见问题,这些内容对于...对于Java开发者来说,深入理解JVM的工作原理和调优策略是不可或缺的专业技能。
1. **jconsole**:Java官方提供的JVM监控工具,可查看内存、线程、类加载等信息。 2. **jvisualvm**:更强大的JVM诊断工具,包含内存、CPU、线程、类加载、方法区等监控功能。 3. **VisualVM**:集成了JProfiler和...
最后,JVM的监控和故障排查工具如JConsole、VisualVM和JMX(Java Management Extensions)提供了查看JVM状态、监控性能指标以及诊断问题的能力。这些工具可以帮助开发者理解应用的运行情况,定位和解决问题。 总之...
总结起来,深入理解JVM内核,熟练掌握诊断技巧,并合理调整JVM配置参数,是每一个Java开发者必备的技能。通过本教程的学习,你将能够运用这些知识有效地提升应用性能,解决实际工作中的各种挑战。
4. VisualVM:开源的全功能JVM监控工具,支持CPU、内存、线程等多方面的监控和分析。 5. jcmd:JDK 9引入的新命令行工具,用于执行各种JVM诊断任务,如堆dump、线程dump等。 二、JVM参数调优 1. -Xms与-Xmx:设置...
总结,JVM调优是一项技术性极强的工作,需要深入理解JVM内存结构、垃圾回收机制,结合实际应用情况,通过调整相关参数实现最佳性能。实践中应结合理论知识与实践经验,不断测试、监控、分析,确保应用的高效稳定运行...