jvm垃圾内存回收问题
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垃圾内存回收问题相关推荐
- Java技术专题之JVM逻辑内存回收机制研究图解版
一.引言 JVM虚拟机内存回收机曾迷惑了不少人,文本从JVM实现机制的角度揭示JVM内存回收的原理和机制. 一.Java平台逻辑架构 二.JVM物理结构 通过从JVM物理结构图我们可以看到: 1.JV ...
- 存储器的分配与回收算法实现_垃圾内存回收算法
(给算法爱好者加星标,修炼编程内功) 来源:施懿民 https://zhuanlan.zhihu.com/p/20712073 常见的垃圾回收算法有引用计数法(Reference Counting). ...
- java垃圾回收菜鸟_java程序员不懂JVM内存回收,两年后也是个菜鸟
java程序员不懂JVM内存回收,两年后也是个菜鸟 在学java程序员的时候,如果你还不懂JVM内存回收,那么你就只能是个很一般的程序员菜鸟了,那么什么是JVM内存回收呢?今天我们就来学习,都还不深入 ...
- JVM垃圾回收系列--内存模型/垃圾回收流程
原文网址:JVM垃圾回收系列--内存模型/垃圾回收流程_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java各个代的关系(内存模型)及垃圾收集流程. 内存模型 JDK8的内存模型 在Java中所有 ...
- 一文解析JVM的内存结构,身为程序员还不弄懂JVM怎么行
欢迎关注专栏:Java架构技术进阶.里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦.微信公众号:慕容千语的架构笔记.欢迎关注一起进步. 前言 Jvm的内存结构是由<jav ...
- Java跨平台实现原理及JVM垃圾回收、内存管理实战
对象已死?啊,难受-- 最近深陷排查各种内存溢出.内存泄漏的问题,不得不对垃圾回收器下手了,因为当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些"自动化"的技术实施必要的 ...
- 第三章 JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程
注意:本文主要参考自<深入理解Java虚拟机(第二版)> 说明:查看本文之前,推荐先知道JVM内存结构,见<第一章 JVM内存结构> 1.内存回收的区域 堆:这是GC的主要区域 ...
- jvm对象从新生代到老年代_JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代...
内存模型 JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示. JVM内存结构由程序计数器.堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)程序计数器 ...
- JVM内存区域(Java内存区域)、JVM垃圾回收机制(GC)初探
一.JVM内存区域(Java内存区域) 首先区分一下JVM内存区域(Java内存区域)和Java内存模型(JMM)的概念.Java线程之间的通信采用的是共享内存模型,这里提到的共享内存模型指的就是Ja ...
最新文章
- 2010年下半年网络工程师考试上午试卷与参考答案(3)
- 什么是shell,shell基础由浅入深,常用的shell命令、用法、技巧
- 趣头条将获得阿里1.71亿美元的可转债,为期三年...
- 程序改错(递归函数):数字转字符
- 二叉树的基本特性和二叉树的几种基本操作的机制_关于二叉树,你该了解这些!...
- Base64加密和Md5加密用户名
- 标准10进制公制度量系统中 倍率关系 大全
- Zookeeper----基本原理
- python服务端编程_python网络编程示例(客户端与服务端)
- laravel框架常用目录路径
- c/c++教程 - 1.1 代码注释
- 中文版Postman测试需要登陆才能访问的接口(基于Cookie)
- 计算机图形学--全局光照RSM
- MATLAB中的变量
- ADXRS620/642/646发布:在PX4上我们为什么扔掉了MPU6000这个IMU
- 搜狗收录提交入口-搜狗网站批量提交方法
- 前端问题记录(持续更新...)
- 2018区块链技术及应用峰会(BTA)·中国全日程发布,大会倒计时5天
- 51智能小车pwm调速
- SQL Developer连接时报错:ORA-12528
热门文章
- tensorflow学习(4.loss函数以及正则化的使用 )
- 【直播】回放!人脸图像算法及其应用
- 【技术综述】计算机审美,学的怎么样了?
- mac远程连接centos安装mysql_centos安装Mysql并远程连接
- ASTreeView Demo:Add, Edit Delete nodes
- href 和 src 的区别
- 2018ICPC-ACM XIAN Invitation Onsite
- [MYSQL] 如何彻底卸载MYSQL5.x
- HTML 元素居中的方法
- Swift函数_默认参数