CrashReport系统在游戏内测当天出现了异常情况JVM僵死,通过top -p <PID> -H 结合jstack(jstack -m -l pid)查看,发现是VM Thread线程CPU占用100%,线程ID好为18540,线程信息如下:
----------------- 18540 -----------------
0xb7904280      _ZN9MarkSweep12follow_stackEv + 0x30
0xb79b0637      _ZN11PSMarkSweep17mark_sweep_phase1Eb + 0xe7
0xb79af737      _ZN11PSMarkSweep16invoke_no_policyEb + 0x3c7
0xb79ba0ae      _ZN10PSScavenge6invokeEv + 0x12e
0xb797f999      _ZN20ParallelScavengeHeap19failed_mem_allocateEjb + 0x49
0xb7ab191a      _ZN29VM_ParallelGCFailedAllocation4doitEv + 0x5a
0xb7ac0096      _ZN12VM_Operation8evaluateEv + 0x46
0xb7abf523      _ZN8VMThread18evaluate_operationEP12VM_Operation + 0x83
0xb7abf794      _ZN8VMThread4loopEv + 0x194
0xb7abf280      _ZN8VMThread3runEv + 0x80
0xb796d64e      _Z10java_startP6Thread + 0x14e
0x0056849b      start_thread + 0xcb

Parallel GC 是JVM的垃圾回收线程( ParallelGC垃圾回收方式的特点是在New区开启多线程回收)
既然是垃圾回收线程CPU占用100%,那么说明我们的应用的JVM内存使用有问题,借助jstat查看JVM的内存信息如下:
jstat -gcutil pid 5000 #这里是说每隔5000毫秒打印异常JVM内存信息

存活区0
存活区1
伊甸区
Old区
永久区
新生带GC次数
新生带GC时间
Full GC次数
Full GC时间
GC的总时间
 S0
S1
E
O
P
YGC
YGCT
FGC
FGCT
GCT
 0.00
0
100
100
98.75
584
13.28
1447
3699.659
3712.939
 0.00
0
100
100
98.75
584
13.28
1447
3699.659
3712.939
 0.00
0
100
100
98.75
584
13.28
1447
3699.659
3712.939
 0.00
0
100
100
98.75
584
13.28
1448
3702.135
3715.416
 0.00
0
100
100
98.75
584
13.28
1448
3702.135
3715.416

存活区0和存活区1的内存占用都是0%,伊甸区使用100%,Old区使用也是100%,Full GC的次数达到1448(3个小时内,差不多9s做一次Full GC,每次Full GC花费2.56s)
也就是说我们的应用频繁的在做Full GC,而且Full GC消耗的时间也比较长,应用在做Full GC是整个应用是会阻塞的,所以在这种情况下我们的应用几乎是不可用的。
什么情况下会引发Full GC呢?参考下图:



Old区内存不够是JVM会触发Full GC,由于Old区一直是满的,所以会频繁触发Full GC,但是这个频度也不高,应该不至于导致CPU使用100%,我们用的是Parallel GC(并行GC),并行GC是说在新生带会采取多线程来进行垃圾回收,由于我们Eden区也是满的,所以GC的线程会CPU占用100%。
怎么查看我们的JVM每个区的内存大小情况呢?用jstat -gccapacity <PID>可以得到结果如下:

新生带最小
新生带最大
新生带当前
存活区
存活区
伊甸区
老年带最小
老年带最大
老年带当前
Old区内存占用
永久区最小
永久区最大
永久区当前
永久区内存占用
新生带GC次数
Full GC 次数
NGCMN
NGCMX
NGC
S0C
S1C
EC
OGCMN
OGCMX
OGC
OC
PGCMN
PGCMX
PGC
PC
YGC
FGC
21824
349504
64384
2112
3904
56448
43712
699072
178496
178496
16384
65536
35712
35712
146
9
21.3125
341.3125
62.875
2.0625
3.8125
55.125
42.6875
682.6875
174.3125
174.3125
16
64
34.875
34.875

我们的Eden区较小,这个可能会触发JVM的一个BUG(1.6u18前的版本,我们的版本是:java version "1.6.0_37")正好在这个范围内,具体信息查看:http://www.oschina.net/question/1092_24066
尝试升级jdk版本或者调整JVM内存参数解决该问题。

转载于:https://blog.51cto.com/zhangshaoxiong/1206281

jvm垃圾内存回收问题相关推荐

  1. Java技术专题之JVM逻辑内存回收机制研究图解版

    一.引言 JVM虚拟机内存回收机曾迷惑了不少人,文本从JVM实现机制的角度揭示JVM内存回收的原理和机制. 一.Java平台逻辑架构 二.JVM物理结构 通过从JVM物理结构图我们可以看到: 1.JV ...

  2. 存储器的分配与回收算法实现_垃圾内存回收算法

    (给算法爱好者加星标,修炼编程内功) 来源:施懿民 https://zhuanlan.zhihu.com/p/20712073 常见的垃圾回收算法有引用计数法(Reference Counting). ...

  3. java垃圾回收菜鸟_java程序员不懂JVM内存回收,两年后也是个菜鸟

    java程序员不懂JVM内存回收,两年后也是个菜鸟 在学java程序员的时候,如果你还不懂JVM内存回收,那么你就只能是个很一般的程序员菜鸟了,那么什么是JVM内存回收呢?今天我们就来学习,都还不深入 ...

  4. JVM垃圾回收系列--内存模型/垃圾回收流程

    原文网址:JVM垃圾回收系列--内存模型/垃圾回收流程_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java各个代的关系(内存模型)及垃圾收集流程. 内存模型 JDK8的内存模型 在Java中所有 ...

  5. 一文解析JVM的内存结构,身为程序员还不弄懂JVM怎么行

    欢迎关注专栏:Java架构技术进阶.里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦.微信公众号:慕容千语的架构笔记.欢迎关注一起进步. 前言 Jvm的内存结构是由<jav ...

  6. Java跨平台实现原理及JVM垃圾回收、内存管理实战

    对象已死?啊,难受-- 最近深陷排查各种内存溢出.内存泄漏的问题,不得不对垃圾回收器下手了,因为当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些"自动化"的技术实施必要的 ...

  7. 第三章 JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程

    注意:本文主要参考自<深入理解Java虚拟机(第二版)> 说明:查看本文之前,推荐先知道JVM内存结构,见<第一章 JVM内存结构> 1.内存回收的区域 堆:这是GC的主要区域 ...

  8. jvm对象从新生代到老年代_JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代...

    内存模型 JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示. JVM内存结构由程序计数器.堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)程序计数器 ...

  9. JVM内存区域(Java内存区域)、JVM垃圾回收机制(GC)初探

    一.JVM内存区域(Java内存区域) 首先区分一下JVM内存区域(Java内存区域)和Java内存模型(JMM)的概念.Java线程之间的通信采用的是共享内存模型,这里提到的共享内存模型指的就是Ja ...

最新文章

  1. 2010年下半年网络工程师考试上午试卷与参考答案(3)
  2. 什么是shell,shell基础由浅入深,常用的shell命令、用法、技巧
  3. 趣头条将获得阿里1.71亿美元的可转债,为期三年...
  4. 程序改错(递归函数):数字转字符
  5. 二叉树的基本特性和二叉树的几种基本操作的机制_关于二叉树,你该了解这些!...
  6. Base64加密和Md5加密用户名
  7. 标准10进制公制度量系统中 倍率关系 大全
  8. Zookeeper----基本原理
  9. python服务端编程_python网络编程示例(客户端与服务端)
  10. laravel框架常用目录路径
  11. c/c++教程 - 1.1 代码注释
  12. 中文版Postman测试需要登陆才能访问的接口(基于Cookie)
  13. 计算机图形学--全局光照RSM
  14. MATLAB中的变量
  15. ADXRS620/642/646发布:在PX4上我们为什么扔掉了MPU6000这个IMU
  16. 搜狗收录提交入口-搜狗网站批量提交方法
  17. 前端问题记录(持续更新...)
  18. 2018区块链技术及应用峰会(BTA)·中国全日程发布,大会倒计时5天
  19. 51智能小车pwm调速
  20. SQL Developer连接时报错:ORA-12528

热门文章

  1. tensorflow学习(4.loss函数以及正则化的使用 )
  2. 【直播】回放!人脸图像算法及其应用
  3. 【技术综述】计算机审美,学的怎么样了?
  4. mac远程连接centos安装mysql_centos安装Mysql并远程连接
  5. ASTreeView Demo:Add, Edit Delete nodes
  6. href 和 src 的区别
  7. 2018ICPC-ACM XIAN Invitation Onsite
  8. [MYSQL] 如何彻底卸载MYSQL5.x
  9. HTML 元素居中的方法
  10. Swift函数_默认参数