JVM 调优测试 之 故意分配小的堆空间,观察gc回收打印的内容
测试代码如下:
@Test
public void testPrintGcDetail(){
HashMap<String, List> gcMap = new HashMap<>(999999);
for(int i=0;i<999999;i++){
List<String> gcList = new LinkedList<String>();
gcMap.put(String.valueOf(i),gcList);
}
System.out.println("over");
}

VM options: -Xmx10m -Xms5m -XX:+PrintGCDetails (注意空格)
-Xmx10m -Xms5m:最大分配堆空间为10m,最小分配堆空间为5m
-XX:+PrintGCDetails: 打印GC详细信息
测试运行结果:


结果:GC(Allocation Failure): minior GC 尝试分配失败,一共尝试了11次;
Full GC (Ergonomics):full GC 全局GC,前面几次正常gc回收,最后回收太频繁了,导致了不给回收了;
最后打印了详细的堆空间占用信息:
YoungGen 总共 2048k(2m)空间,ParOldGen 总共4096k(4m)空间 Metaspace 总共 5447k(5.5M)
YounGen 区域内 eden:from = 1:1 官方默认是 8:1(官方认为最优)
eden 区使用率 96% parOldGen 使用率 30%
调整Xms 到 10m ,使xmx和xms一样大,观察打印结果

对比发现,PSYounGen 区域总空间大小没有改变,而ParOldGen 分配了更多的空间至 7168k
而且实际运行中发现,第二次gc程序报错的时间比第一次要迟(第一次运行了0.873s 第二次运行了1.344s),说明xms的设置过小,导致gc一直在做。
官方给的解释:
Exception in thread thread_name: java.lang.OutOfMemoryError: GC Overhead limit exceeded
Cause: The detail message "GC overhead limit exceeded" indicates that the garbage collector is running all the time and Java program is making very slow progress. After a garbage collection, if the Java process is spending more than approximately 98% of its time doing garbage collection and if it is recovering less than 2% of the heap and has been doing so far the last 5 (compile time constant) consecutive garbage collections, then a java.lang.OutOfMemoryError is thrown. This exception is typically thrown because the amount of live data barely fits into the Java heap having little free space for new allocations.
Action: Increase the heap size. The java.lang.OutOfMemoryError exception for GC Overhead limit exceeded can be turned off with the command line flag -XX:-UseGCOverheadLimit.
VM花费了98%的时间进行垃圾回收,而只得到2%可用的内存,这样是不被允许的,除非加上 -XX:-UseGCOverheadLimit
然后我就区加了这个参数,果然。。。成功地报了堆内存溢出的错误

增加
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=导出的路径 来查看 详细信息,再次运行代码,会生成hprof文件,需要用到mat工具来查询详细信息

最终调整: -Xmx200m -Xms100m -XX:+PrintGCDetails

从图上可以看,正常走完了程序,然后看明细数据:
PSYoungGen 55296k,eden 512000k,from 4096k eden:from = 12.5
根据占用比计算,一共花费了 46173k+87447k=133620k(约130m) 堆空间,5385k元空间(jdk1.8以后的永久代不在堆内,而转移到直接内存中了)
总结:在设置堆空间时候,xms不要设置太小,不然会一直gc gc gc(即使你的xmx设置的足够大),导致程序出错。当然xmx也不能太小。
JVM 调优测试 之 故意分配小的堆空间,观察gc回收打印的内容的更多相关文章
- 深入理解JAVA虚拟机(内存模型+GC算法+JVM调优)
目录 1.Java虚拟机内存模型 1.1 程序计数器 1.2 Java虚拟机栈 局部变量 1.3 本地方法栈 1.4 Java堆 1.5 方法区(永久区.元空间) 附图 2.JVM内存分配参数 2.1 ...
- JVM调优(一)
JVM调优的主要过程有: 确定堆内存大小(-Xmx, -Xms).合理分配新生代和老生代(-XX:NewRation, -Xmn, -XX:SurvivorRatio).确定永久区大小: -XX:Pe ...
- jvm系列(六):jvm调优-从eclipse开始
jvm调优-从eclipse开始 概述 什么是jvm调优呢?jvm调优就是根据gc日志分析jvm内存分配.回收的情况来调整各区域内存比例或者gc回收的策略:更深一层就是根据dump出来的内存结构和线程 ...
- JVM调优浅谈
1.数据类型 java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:它代表的值就是数值本身,而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本 ...
- JVM调优总结 + jstat 分析(转)
[转] JVM调优总结 + jstat 分析 JVM调优总结 + jstat 分析 jstat -gccause pid 1 每格1毫秒输出结果jstat -gccause pid 2000 每格2秒 ...
- JVM调优实战
JVM调优实战 文档修订记录 版本 日期 撰写人 审核人 批准人 变更摘要 & 修订位置 ...
- 老李分享:JVM调优
老李分享:JVM调优 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨 ...
- java虚拟机学习-JVM调优总结-调优方法(12)
JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回收算法有很详细的跟踪.详细说明参考这里 ...
- JVM调优(二)经验参数设置
调优设置具体解析 堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5 ...
随机推荐
- redis:String字符串类型(三)
字符串拼接(如果key不存在则创建):append name " applesnt" 获取字符串的长度:strlen name 127.0.0.1:6379> set nam ...
- # Unity 游戏框架搭建 2019 (三十四、三十五) 9 ~ 10 示例整理
第九个示例 目前代码如下: using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif namespace QFramework { p ...
- Java中基础类基础方法(学生类)(手机类)
学生类: //这是我的学生类class Student { //定义变量 //姓名 String name; //null //年龄 int age; //0 //地址 String address; ...
- Centos8安装Docker提示:package docker-ce-3:19.03.8-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
Centos8安装Docker提示:package docker-ce-3:19.03.8-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but ...
- 架构设计 | 分布式业务系统中,全局ID生成策略
本文源码:GitHub·点这里 || GitEE·点这里 一.全局ID简介 在实际的开发中,几乎所有的业务场景产生的数据,都需要一个唯一ID作为核心标识,用来流程化管理.比如常见的: 订单:order ...
- Inno Setup 大师 Tlama
https://stackoverflow.com/users/960757/tlama
- 【抓包工具】tcpdump
tcpdump - dump traffic on a network 根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析.它支 ...
- 【DNS域名解析命令】 nslookup
1. nslookup作用 nslookup用于查询DNS的记录,查询域名解析是否正常,在网络故障时用来诊断网络问题 nslookup - query Internet name servers in ...
- 标准库shelve
shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
- CTO为何要微服务评估
为什么定义参考模型 之前我的工作,大部分时间都是聚焦在某个产品/团队,为他们提供微服务/DevOps的实施及指导.进入公司后,同时参与了多个产品团队的改造研讨.其中最大的不同在于: 在面对一个团队的时 ...