java进程占用高内存原因分析与优化方法

上传人:bin****86 文档编号:59370579 上传时间:2018-11-06 格式:DOCX 页数:8 大小:18.22KB
返回 下载 相关 举报
java进程占用高内存原因分析与优化方法_第1页
第1页 / 共8页
java进程占用高内存原因分析与优化方法_第2页
第2页 / 共8页
java进程占用高内存原因分析与优化方法_第3页
第3页 / 共8页
java进程占用高内存原因分析与优化方法_第4页
第4页 / 共8页
java进程占用高内存原因分析与优化方法_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《java进程占用高内存原因分析与优化方法》由会员分享,可在线阅读,更多相关《java进程占用高内存原因分析与优化方法(8页珍藏版)》请在金锄头文库上搜索。

1、我真正系统地接触和学习党的基本知识是在这次中级党校的培训班上。通过学习,了解了党的发展历程,对党的性质、宗旨、任务等基本知识有了进一步的了解JAVA进程占用高内存原因分析与优化方法首先看一下一个java进程的jmap输出:代码如下:lexchou $ jmap -heap 837Attaching to process ID 837, please wait.Debugger attached successfully.Server compiler detected.JVM version is 20.10-b01using thread-local object allocation.Pa

2、rallel GC with 2 thread(s)Heap Configuration:MinHeapFreeRatio = 40MaxHeapFreeRatio = 70MaxHeapSize = (4096.0MB)NewSize = (1.25MB)MaxNewSize = 415 MBOldSize = (5.1875MB)NewRatio = 2SurvivorRatio = 8PermSize = (20.75MB)MaxPermSize = (82.0MB)Heap Usage:PS Young GenerationEden Space:capacity = (39.125MB

3、)used = (17.0938MB)free = (21.9062MB)44.8624% usedFrom Space:capacity = (4.125MB)used = (3.53125MB)free = (0.59375MB)85.061% usedTo Space:capacity = (4.3125MB)used = 0 (0.0MB)free = (4.3125MB)0.0% usedPS Old Generationcapacity = 5398XX2 (514.8125MB)used = (103.547MB)free = (411.453MB)20.8376% usedPS

4、 Perm Generationcapacity = (82.0MB)used = (57.922MB)free = (24.078MB)70.588% used然后再用ps看看:代码如下:lexchou $ ps -p 837 -o vsz,rssVSZ RSS 关于这里的几个generation网上资料一大把就不细说了,这里算一下求和可以得知前者总共给Java环境分配了644M的内存,而ps输出的VSZ和RSS分别是7.4G和2.9G,这到底是怎么回事呢?前面jmap输出的内容里,MaxHeapSize 是在命令行上配的,-Xmx4096m,这个java程序可以用到的最大堆内存。VSZ是指

5、已分配的线性空间大小,这个大小通常并不等于程序实际用到的内存大小,产生这个的可能性很多,比如内存映射,共享的动态库,或者向系统申请了更多的堆,都会扩展线性空间大小,要查看一个进程有哪些内存映射,可以使用 pmap 命令来查看:代码如下:lexchou $ pmap -x 837837: javaAddress Kbytes RSS Dirty Mode Mapping00000 36 4 0 r-x- java08000 8 8 8 rwx- javac9000 13676 13676 13676 rwx- anon fae00000 83968 83968 83968 rwx- anon 0

6、0000 rwx- anon d0000 0 0 - anon .00007f55ee 4 4 0 r-xs- az.png00007fff017ff000 4 4 0 r-x- anon ffffffffff 4 0 0 r-x- anon - - - -total kB 这里可以看到很多anon,这些表示这块内存是由mmap分配的。RSZ是Resident Set Size,常驻内存大小,即进程实际占用的物理内存大小, 在现在这个例子当中,RSZ和实际堆内存占用差了2.3G,这2.3G的内存组成分别为:JVM本身需要的内存,包括其加载的第三方库以及这些库分配的内存NIO的DirectBuf

7、fer是分配的native memory内存映射文件,包括JVM加载的一些JAR和第三方库,以及程序内部用到的。上面 pmap 输出的内容里,有一些静态文件所占用的大小不在Java的heap里,因此作为一个Web服务器,赶紧把静态文件从这个Web服务器中人移开吧,放到nginx或者CDN里去吧。JIT, JVM会将Class编译成native代码,这些内存也不会少,如果使用了Spring的AOP,CGLIB会生成更多的类,JIT的内存开销也会随之变大,而且Class本身JVM的GC会将其放到Perm Generation里去,很难被回收掉,面对这种情况,应该让JVM使用ConcurrentMa

8、rkSweep GC,并启用这个GC的相关参数允许将不使用的class从Perm Generation中移除, 参数配置: -XX:+UseConcMarkSweepGC -X:+CMSPermGenSweepingEnabled -X:+CMSClassUnloadingEnabled,如果不需要移除而Perm Generation空间不够,可以加大一点: -X:PermSize=256M -X:MaxPermSize=512MJNI,一些JNI接口调用的native库也会分配一些内存,如果遇到JNI库的内存泄露,可以使用valgrind等内存泄露工具来检测线程栈,每个线程都会有自己的栈空间

9、,如果线程一多,这个的开销就很明显了jmap/jstack 采样,频繁的采样也会增加内存占用,如果你有服务器健康监控,记得这个频率别太高,否则健康监控变成致病监控了。关于JVM的几个GC堆和GC的情况,可以用jstat来监控,例如监控进程837每隔1000毫秒刷新一次,输出20次:代码如下:lexchou $ jstat -gcutil 837 1000 20S0 S1 E O P YGC YGCT FGC FGCT GCT0.00 80.43 24.62 87.44 98.29 7101 119.652 40 19.719 139.3710.00 80.43 33.14 87.44 98.2

10、9 7101 119.652 40 19.719 139.371几个字段分别含义如下:S0年轻代中第一个survivor(幸存区)已使用的占当前容量百分比S1年轻代中第二个survivor(幸存区)已使用的占当前容量百分比E年轻代中Eden(伊甸园)已使用的占当前容量百分比Oold代已使用的占当前容量百分比Pperm代已使用的占当前容量百分比YGC从应用程序启动到采样时年轻代中gc次数YGCT从应用程序启动到采样时年轻代中gc所用时间(s)FGC从应用程序启动到采样时old代(全gc)gc次数FGCT从应用程序启动到采样时old代(全gc)gc所用时间(s)GCT从应用程序启动到采样时gc用的总时间(s)结论因此如果正常情况下jmap输出的内存占用远小于 RSZ,可以不用太担心,除非发生一些严重错误,比如PermGen空间满了导致OutOfMemoryError发生,或者RSZ太高导致引起系统公愤被OOM Killer给干掉,就得注意了,该加内存加内存,没钱买内存加交换空间,或者按上面列的组成部分逐一排除。这几个内存指标之间的关系是:VSZ RSZ Java程序实际使用的堆大小对党的认识也有了进一步的提高。才真正体会到了中国共产党的伟大、光荣和正确,更感到只有中国共产党是全中国最广大人民利益的忠实代表

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 总结/报告

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号