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 ...
随机推荐
- vue2.x学习笔记(一)
使用vue开发项目已经过了一段时间了,对其中的很多东西还是一知半解,于是想要系统学习一下.主要内容是参照官方中文网站https://cn.vuejs.org/v2/guide/,然后加上一些自己的理解 ...
- 1. ajax递归并发处理
在某些情况下可能会需要循环ajax请求,可以利用递归发送 function recursion( index,array ) { if ( index < array.length ) { // ...
- [javascript]JS获取当前时间戳的方法
JavaScript 获取当前时间戳: 第一种方法:(这种方法只精确到秒) var timestamp = Date.parse(new Date()); 结果:1280977330000 第二种方法 ...
- 基于 HTML WebGL 的会展中心智能监控系统
前言 随着近几年物联网.万物互联等诸多概念的大行其道,智慧城市的概念也早已经被人们耳熟能详,而作为城市的组成部分,智慧建筑也是重中之重,智慧园区,智慧小区等也如雨后春笋般的相继出现. 智慧建筑是指通过 ...
- 4、flink自定义source、sink
一.Source 代码地址:https://gitee.com/nltxwz_xxd/abc_bigdata 1.1.flink内置数据源 1.基于文件 env.readTextFile(" ...
- 超详细步骤---Linux下的最新Git版本安装
原文地址:https://blog.csdn.net/u010887744/article/details/53957613 [标注大头] 1.查看当前git版本:git --version 查看最新 ...
- Java创建对象时的简单内存分析
简单创建对象的内存分析 主程序: 1 public class Application { 2 public static void main(String[] args) { 3 Animal do ...
- union 的概念及在嵌入式编程中的应用
union 概念 union 在中文的叫法中又被称为共用体,联合或者联合体,它定义的方式与 struct 是相同的,但是意义却与 struct 完全不同,下面是 union 的定义格式: union ...
- C#多线程(16):手把手教你撸一个工作流
目录 前言 节点 Then Parallel Schedule Delay 试用一下 顺序节点 并行任务 编写工作流 接口构建器 工作流构建器 依赖注入 实现工作流解析 前言 前面学习了很多多线程和任 ...
- 【Linux常见命令】lsof命令
lsof - list open files lsof命令用于查看你进程打开的文件,进程打开的端口(TCP.UDP),找回/恢复删除的文件,打开文件的进程. 语法: lsof [选项] [文件] 常用 ...