版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JVM内存监控及性能调优
二月23黄国庆重庆市擎天博元科技有限公司2023/2/4MetarnetTechnologiesCo.,Ltd.2JVM内存监控及性能调优
主要内容什么是JVMJVM内存模型内存分配垃圾回收监控实例配置实例2023/2/4MetarnetTechnologiesCo.,Ltd.3JVM内存监控及性能调优什么是JVM?基本上来说,JVM是一个虚拟运行环境,对于字节码来说就像是一个机器一样,可以执行任务,并通过底层实现执行内存相关的操作。JVM使Java程序做到了“一次编写,到处运行”。JVM解放了程序员,使程序员不必再关系对象的生命周期,使程序员不必再关心应该在何时释放内存。可以将JVM当做是一种专为Java而生的特殊的操作系统,它的工作是管理运行Java应用程序的运行时环境。2023/2/4MetarnetTechnologiesCo.,Ltd.4JVM内存监控及性能调优什么是OOM?out-of-memory系统无法为新线程和新对象分配空间“堆”满了,垃圾回收不成功影响:业务宕机2023/2/4MetarnetTechnologiesCo.,Ltd.5JVM内存监控及性能调优JVM内存模型各个年代:新生代(YoungGeneration)伊甸园空间(Eden
)、幸存者空间(Survivor
)最新被创建的对象会被分配到这里,由于大部分对象在创建后会很快变得不可到达,所以很多对象被创建在新生代,然后消失。老年代(OldGeneration)对象没有变得不可达,并且从新生代中存活下来,会被拷贝到这里。持久代(PermanentGeneration)也被称为方法区(methodarea)。他用来保存类常量以及字符串常量。先理解养鱼专业户的“渔池”?
2023/2/4MetarnetTechnologiesCo.,Ltd.6JVM内存监控及性能调优JVM内存模型每个空间的执行顺序如下:绝大多数刚刚被创建的对象会存放在伊甸园空间。在伊甸园空间执行了第一次GC之后,存活的对象被移动到其中一个幸存者空间。
此后,在伊甸园空间执行GC之后,存活的对象会被堆积在同一个幸存者空间。
当一个幸存者空间饱和,还在存活的对象会被移动到另一个幸存者空间。之后会清空已经饱和的那个幸存者空间。在以上的步骤中重复几次依然存活的对象,就会被移动到老年代。2023/2/4MetarnetTechnologiesCo.,Ltd.7JVM内存监控及性能调优JVM内存模型垃圾回收(GC)是旨在释放不可达Java对象所占用的内存的过程,是Javavirtualmachine(JVM)中动态内存管理系统的核心组成部分。在一个典型的垃圾回收周期中,所有仍被引用的对象,即可达对象,会被保留。没有被引用的Java对象所占用的内存会被释放并回收,以便分配给新创建的对象。发生在新生代的对象的消失:minorGC(局部垃圾回收)发生在老年代的对象的消失:majorGC(完全垃圾回收)2023/2/4MetarnetTechnologiesCo.,Ltd.8JVM内存监控及性能调优内存分配当你在启动Java应用程序时指定了启动参数_-Xmx_(例如,java-Xmx2gMyApp),则相应大小的内存会被分配给Java进程。这块内存即所谓的*Java堆*(或简称为*堆*)。这块专用的内存地址空间用于存储Java应用程序所创建的对象。随着Java应用程序的运行,会不断的创建新对象并为之分配内存,Java堆(即地址空间)会逐渐被填满。32位与64位的区别32位JVM最大堆为1.5G64位JVM最大堆为操作系统中内存可使用空间大小2023/2/4MetarnetTechnologiesCo.,Ltd.9JVM内存监控及性能调优垃圾回收minorGCmajorGC目标快速释放不可达对象所占用的内存,防止应用程序出现OOM错误。回收内存时,对应用程序的性能(指延迟和吞吐量)的影响要尽可能小原则JVM堆不是越大越好(堆越大GC时间越长)不是每个应用程序的JVM配置均可以一样(应用规模、结构和响应要求不一样)调优的操作是循序渐进的(摸着石头过河)2023/2/4MetarnetTechnologiesCo.,Ltd.10JVM内存监控及性能调优监控实例JVM监控工具命令行:jstat(关注GC的次数和GC所耗时间)jmap(将内存堆印象保存为文件)HeapAnalyzer(分析jmap保存的文件)图形化JconsoleVisualVM2023/2/4MetarnetTechnologiesCo.,Ltd.11JVM内存监控及性能调优监控实例JVM监控工具示例jstat–gc$vmid$1000(vmid是java应用的进程id号,1000:每隔一秒展示GC监控数据)从上图中可计算得到以下值:年青代GC发生了1989次(YGCT),共耗费了41.001秒(YGC),故年青代每次GC的时间为:41.001/1989=0.020秒完全GC发生了1次(FGCT),共耗费了0.971秒(FGC),故完全GC每次GC的时间为:0.971/1=0.971秒一般性能较好的判断:年青代GC耗时在50~100毫秒以内,完全GC小于1秒以内为很好的性能。(因为GC均会影响系统访问)2023/2/4MetarnetTechnologiesCo.,Ltd.12JVM内存监控及性能调优监控实例JVM监控工具示例jmap
-dump:format=b,file=testjvm.dump
$vmid$(vmid是java应用的进程id号,file:java堆内存数据保存为文件的名称)以上的命令可以将当前JAVA内存堆保存为文件,便于进一步进行分析。特别注意:
进行此工作的时候,应用访问可能会中断。所以不应该在业务运行状态下操作此命令。2023/2/4MetarnetTechnologiesCo.,Ltd.13JVM内存监控及性能调优监控实例JVM分析工具示例HeapAnalyzer命令行:java-Xmx800m-jarha395.jar(注意:-Xmx800m是指定工具所需的java堆大小,此值要大于分析文件的尺寸大小,如果启动过程中发现控制台有java.lang.OutOfMemoryError出现,可以适当加大上面的数字800,给予更多的空间。ha395.jar中的文件名称按实际下载解压后的文件名为准)2023/2/4MetarnetTechnologiesCo.,Ltd.14JVM内存监控及性能调优监控实例JVM监控工具示例
HeapAnalyzer输出的内容:以下表内容即显示当前系统中出现泄漏的对象(flex/messaging/messages/AsyncMessage)及占用内存的大小。LeakSizeTotalSizeSizeAnalysisNameNo.ChildNo.ParentAddress16199787316199787387Responsiblefor161,997,873bytes(61.14%)ofJavaheapContains2instancesofthefollowingleaksuspects:-arrayof[Ljava/lang/Object;holding61,312,817bytesat0x1a076af0-arrayof[Ljava/lang/Object;holding66,644,382bytesat0x12e5fc68flex/messaging/MessageClient1040xb53e1e866644382666443826972866,644,382bytes(25.15%)ofJavaheapisusedby13,321instancesofflex/messaging/messages/AsyncMessage-Containedunderflex/messaging/MessageClientholding161,997,873bytesat0xb53e1e8arrayof[Ljava/lang/Object;1332110x12e5fc686400692364006923064,006,923bytes(24.16%)ofJavaheapisusedby46,275instancesofbyte[]byte[](61MB/24.2%)000x0613128176131281721661,312,817bytes(23.14%)ofJavaheapisusedby54instancesofflex/messaging/SessionMetricsTrackerContains3instancesofthefollowingleaksuspects:-arrayof[Ljava/lang/Object;holding15,550,384bytesat0x15c5f748-arrayof[Ljava/lang/Object;holding31,137,630bytesat0x179d3ff8-arrayof[Ljava/lang/Object;holding14,608,060bytesat0x167c6918-Containedunderflex/messaging/MessageClientholding161,997,873bytesat0xb53e1e8arrayof[Ljava/lang/Object;5410x1a076af031137630311376303098831,137,630bytes(11.75%)ofJavaheapisusedby6,212instancesofflex/messaging/messages/AsyncMessage-Containedunderarrayof[Ljava/lang/Object;holding61,312,817bytesat0x1a076af0arrayof[Ljava/lang/Object;621210x179d3ff815550384155503841376815,550,384bytes(5.87%)ofJavaheapisusedby3,108instancesofflex/messaging/messages/AsyncMessage-Containedunderarrayof[Ljava/lang/Object;holding61,312,817bytesat0x1a076af0arrayof[Ljava/lang/Object;310810x15c5f74814608060146080603098814,608,060bytes(5.51%)ofJavaheapisusedby5,894instancesofflex/messaging/messages/AsyncMessage-Containedunderarrayof[Ljava/lang/Object;holding61,312,817bytesat0x1a076af0arrayof[Ljava/lang/Object;589410x167c69181213937612139376012,139,376bytes(4.58%)ofJavaheapisusedby14,365instancesofint[]int[](11.6MB/4.6%)000x02023/2/4MetarnetTechnologiesCo.,Ltd.15JVM内存监控及性能调优监控实例JVM监控工具示例Jconsole命令行:jconsole.exeserver_IP:7080(注意:Server_IP为运行java程序的服务器IP,7080为专门为jconsole远程连接而配置开通的JMX端口。以下为Windows平台下配置方法:setJAVA_OPTS=%JAVA_OPTS%-Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.port=7080-Dcom.sun.management.jmxremote)2023/2/4MetarnetTechnologiesCo.,Ltd.16JVM内存监控及性能调优监控实例JVM监控工具示例visualVMJDK1.6以上版本免费提供,服务器上相应配置与Jconsole连接时一样(注意:Server_IP为运行java程序的服务器IP,7080为专门为jconsole远程连接而配置开通的JMX端口。提示:如visualVM在JAVA程序本机运行,可以直接运行监控到,不需对JMX端口进行设置)2023/2/4MetarnetTechnologiesCo.,Ltd.17JVM内存监控及性能调优监控实例JVM监控工具示例2023/2/4MetarnetTechnologiesCo.,Ltd.18JVM内存监控及性能调优监控实例JVM监控工具示例2023/2/4MetarnetTechnologiesCo.,Ltd.19JVM内存监控及性能调优配置实例Jconsole监控,HeapDump分析实例
通过以下jconsole监控截图,我们发现应用服务器的堆内存一直在上升。虽然有定时的GC操作(内存回收),但整体趋势仍然是一个斜坡上行的过程。2023/2/4MetarnetTechnologiesCo.,Ltd.20JVM内存监控及性能调优配置实例Jconsole监控,HeapDump分析实例
通过以下jconsole监控截图,我们发现应用服务器的堆内存已经占用完,年青代和老年代均没有可进行再分配的空间了,此时执行GC也不能成功。当前应用的状态就是无法访问了。
再通过其GC时间可看到,Copy(即年青代回收)平均每次为1*60/18646=0.0032秒,没有问题;FullGC为4680秒(1小时18分钟)/2304=2.03秒。由此可以看出,FullGC占用了大量时间和次数,但仍然无法将内存清理出来。证明内存中的某些对象未被成功释放,需要继续分析。2023/2/4MetarnetTechnologiesCo.,Ltd.21JVM内存监控及性能调优配置实例Jconsole监控,HeapDump分析实例通过heapdump分析工具,发现系统中已经有非常多的flex/messaging/messages/AsyncMessage实例占用了大部分的内存。由此即定位了是哪个实例出现问题,可以联系开发人员进行配合检查了。2023/2/4MetarnetTechnologiesCo.,Ltd.22JVM内存监控及性能调优配置实例
通过开发人员分析检查,确认flex的消息对象默认没有设置其失效时间,建立的对象将永远不会失效,故就会造成对象不停的建立,直到内存溢出。故修改其配置文件,设置相关对象失效时间,达到JAVA可以回收其占用的内存空间,如下:<destinationid="chat"><properties><network><subscription-timeout-minutes>30</subscription-timeout-minutes>
</network><server> <message-time-to-live>10000</message-time-to-live> <allow-subtopics>true</allow-subtopics> <subtopic-separator>.</subtopic-separator></server></properties><channels> <channelref="my-polling-amf"/></channels></destination>2023/2/4MetarnetTechnologiesCo.,Ltd.23JVM内存监控及性能调优配置实例JVM参数介绍以下配置为针对一个特定的应用环境进行的配置:-Xmx4096m最大JAVA堆4G-Xms4096m初始化JAVA堆4G,一般服务器上均设置为最大一样-Xmn1536M年青代堆设置值1.5G-XX:SurvivorRatio=10年青代中Eden区与Survivor区的比例-XX:PermSize=25
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论