本周有同事反馈,IDC环境出现了CPU非常高的问题,如下图:
看一下HeapSpace的情况,如下图,很明显,HeapSpace已经到达了一个临界值:
看一下GC数据统计,短短1个小时,竟然FullGC了946次:
猜想:在HeapSpace逼近临界值的时候,分配小块内存(譬如创建一个对象,如果是分配大块内存,实际上JVM直接就报OutOfMemory了),JVM发现内存不足,会尝试去FullGC出空闲内存,每次还真能挤出一点点,但很快又得重新FullGC,我们知道,实际上FullGC是非常消耗CPU的操作。但为啥不报OutOfMemory呢?因为每次总能够释放出一点点内存,因此竟然就这么维持下去了。这里非常郁闷,JVM直接报OutOfMemory还好过一点,至少直接知道原因。
JVM一般启动参数有一个GCTimeRatio参数,表示目标吞吐量,JVM会自动调整各内存区大小去达到该吞吐量值,如果吞吐量低于某个值,是会自动OutOfMemory,目前该值默认是1,表示GC时间占总时间不超过1%,但目前来看,要通过这种方式去让JVM直接报告OutOfMemory而不是持续维持高CPU看起来是不行的。
已经可以定位到是内存达到临界值的问题,接下来问题就简单了,dump出HeapSpace空间,使用Eclipse Memory Analyzer分析一下,原因一目了然,有点讶异,竟然是BlackStar的detail工作模式导致的,这里是因为使用的时候策略没有调整好,调整detail策略,重新启动JVM,问题解决,当然这里BlackStar的detail工作模式的自我保护方式也不好,实际上当发现使用内存过多的时候,应该调整自动放弃。
分享到:
相关推荐
记录java.lang.OutOfMemoryError:Java heap space的情况 文章内容: 一.问题描述+原因分析+解决方案 二.JVM调优说明 三.Tomcat添加到jvisualvm监控
Java JVMJava JVMJava JVM
在eclipse设置JVM heap 的最小值与最大值的图案
linux 下用java 获取系统信息 cpu mem jvm等 用java调用系统命令得到,方便实用
jvm java虚拟机 调优 马士兵 笔记 让你对java虚拟机调优有初步的认识
jvm规范和java规范书籍。对深入理解JVM和深入了解java很有帮助
java版本的<write your own java virtual machine>。
Java Jar JVM Exe 可执行文件 Java Jar JVM Exe 可执行文件 Java Jar JVM Exe 可执行文件 Java Jar JVM Exe 可执行文件 Java Jar JVM Exe 可执行文件
JVM PermGen space 溢出 JVM heap space 溢出 Native Heap 溢出 三种溢出原因 供大家参考
JVM(Java虚拟机)的整个流程:发展,运行区域,垃圾回收器,内存分配策略,垃圾收集,JVM分析工具,JVM优化
JVM JMX java
Java助力需要jvm学习及优化与性能瓶颈分析参考
java11-jvm白皮书
java 查看JVM中所有的线程的活动状况 java 查看JVM中所有的线程的活动状况
java获得jvm内存大小
IBM Thread and Monitor Dump Analyzer for Java专业JVM调优工具 一、使用方法 1.使用java -jar启动程序 2.找到需要分析的jvm进程 3.使用jstack [pid] > /tmp/sdapjvmlog.txt导出进程的详细日志 4.使用程序打开...
JAVA JVM原理资料,最新。很不错,看看吧。
java基础之JVM,jvm是java的核心技术,也是面试过程中经常出现的
JVM与Java体系结构
下载 java JVM INSTR 反编译下载 java JVM INSTR 反编译