叫练手把手教你读JVM之GC信息
案例
众所周知,GC主要回收的是堆内存,堆内存中包含年轻代和老年代,年轻代分为Eden和Surivor,如下图所示。我们用案例分析下堆的GC信息【版本:HotSpot JDK1.8】。

/**
* @author :jiaolian
* @date :Created in 2021-03-15 15:02
* @description:新生代内存测试
* @modified By:
* 公众号:叫练
*/
public class NewGenTest {
public static void main(String[] args) {
//每次在Eden申请1M空间
byte[] bytes = null;
for (int i=0; i<5; i++) {
bytes = new byte[1024*1024];
}
}
}
案例很简单,for循环运行5次,每次在Eden申请1M空间,假设我们分配堆内存空间是20m,并打印GC详细信息,配置过程:-XX:+PrintGCDetails -Xmx20m。
- -XX:+PrintGCDetails:打印GC详细信息。
- -Xmx20m:分配最大堆内存空间是20m。
GC详细分析
运行程序,IDEA控制台打印结果如下:
- 第一句话:年轻代GC了一次,因为第五次循环,Eden满了,年轻代内存约6M(6144K),Eden回收前约5M(5057K),回收后是489K,年轻代内存回收前约是5M,回收后约是2M(1783K),总堆内存大小约是20M(19968K),GC耗时0.0016002 secs。
- 第二句话:年轻代总内存约6M,使用约5M。
- 第三句话:eden空间总内存约5M(5632K),使用率是94%。
- 第四句话:from是512K,使用率是95%。
- 第五句话:老年代总空间约14M(13824K),使用了1294K,这个使用空间是因为程序在Eden申请1M空间,判断空间不够,就申请from或者to空间,发现只有512K,就触发monitor GC,将1M内存申请在老年代。
- 第六句话:元空间内存。

- -Xms 初始堆大小,不够时,会自动扩展,所以一般Xms空间和Xmx最大堆空间设置成一样的。
上面程序不变,设置JVM参数,-XX:+PrintGCDetails -Xmx20m -Xms5m,运行程序,部分结果如下图所示。

如上图所示:初始化堆大小是5M,新生代内存一共发生了4次GC,从上图可以分析,Eden只有1M多内存可以被申请,所以第二次for循环申请1M空间就触发了GC,数据就被丢进老年代,连续3次后,GC堆的空间由5M变为了6M,说明初始化堆空间不够使,可以自动扩展堆内存。
当然我们还可以通过-Xmn 设置年轻代大小。下面我们看看年轻代中,Eden和from/to区域怎么划分。
上面程序不变,设置JVM参数,-XX:+PrintGCDetails -Xmx20m -Xmn10m -XX:SurvivorRatio=2,运行程序,部分结果如下图所示。
- -Xmn10m:设置新生代内存为10m。
- -XX:SurvivorRatio=2:设置新生代中eden和Survivor比例是2:1。

我们设置新生代是10M,这里显示新生代大小是7.5M(7680K),实际上from/to是有一块空间是每次GC做交换的区域(方便垃圾回收),所以实际上7680K=5120+2560。5120/2560=2,也就是新生代和和Survivor空间比例。
另外还有:-XX:NewRatio:设置老年代和新生代比例,一般是1/3)。比如设置-XX:NewRatio=2 -XX:+PrintGCDetails -Xmx30m
那么老年代空间是20M,新生代空间是10M。
总结
最后总结下:
- -XX:+PrintGCDetails:打印GC详细信息。
- -Xmx20m:分配最大堆内存空间是20m。
- -Xmn10m:设置新生代内存为10m。
- -XX:SurvivorRatio=2:设置新生代中eden和Survivor比例。
- -XX:NewRatio:设置老年代和新生代比例,一般是1/3)。
今天学习了JVM之GC信息参数配置,写的不全同时还有许多需要修正的地方,希望亲们加以指正和点评,喜欢的请点赞加关注哦。点关注,不迷路,我是【叫练】公众号,微信号【jiaolian123abc】边叫边练。
叫练手把手教你读JVM之GC信息的更多相关文章
- 《手把手教你》系列基础篇(八十七)-java+ selenium自动化测试-框架设计基础-Log4j 2实现日志输出-上篇(详解教程)
1.简介 Apache Log4j 是一个非常古老的日志框架,并且是多年来最受欢迎的日志框架. 它引入了现代日志框架仍在使用的基本概念,如分层日志级别和记录器. 2015 年 8 月 5 日,该项目管 ...
- 手把手教你做个人 app
我们都知道,开发一个app很大程度依赖服务端:服务端提供接口数据,然后我们展示:另外,开发一个app,还需要美工协助切图.没了接口,没了美工,app似乎只能做成单机版或工具类app,真的是这样的吗?先 ...
- 【转】手把手教你把Vim改装成一个IDE编程环境(图文)
手把手教你把Vim改装成一个IDE编程环境(图文) By: 吴垠 Date: 2007-09-07 Version: 0.5 Email: lazy.fox.wu#gmail.com Homepage ...
- iOS回顾笔记(05) -- 手把手教你封装一个广告轮播图框架
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- 最准确的单点登录SSO图示和讲解(有代码范例)|手把手教做单点登录(SSO)系列之二
写第一篇博客<手把手教做单点登录(SSO)系列之一:概述与示例>,就获得了园子里朋友们热情的评论和推荐,感谢各位. 我那篇文章同时发了CSDN和博客园.对比一下,更感受到博客园童鞋们的技术 ...
- 沉淀,再出发——手把手教你使用VirtualBox搭建含有三个虚拟节点的Hadoop集群
手把手教你使用VirtualBox搭建含有三个虚拟节点的Hadoop集群 一.准备,再出发 在项目启动之前,让我们看一下前面所做的工作.首先我们掌握了一些Linux的基本命令和重要的文件,其次我们学会 ...
- 【转】手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)
1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理! 我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...
- 手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)
1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理! 我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...
- 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接
本文原作者:“水晶虾饺”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.引言 好多小白初次接触即时通讯(比如:IM或者消息推送应用)时,总是不 ...
随机推荐
- BellmanFord为什么只需松弛V-1次
首先s不用松弛,V-=1 然后对于其他的顶点..每次都至少能完全松弛一个顶点.. 为什么呢..因为初始d[s]=0,所以和s相邻接的边都将被松弛完全..无论松弛的顺序 那么对于这个图,无论松弛的顺序都 ...
- Java开发工程师最新面试题库系列——Java基础部分
JAVA基础 面向对象有哪些特征? 答:继承.封装.多态 JDK与JRE的区别是什么? 答:JDK是java开发时所需环境,它包含了Java开发时需要用到的API,JRE是Java的运行时环境,JDK ...
- 网站资源被盗链的:预防方法 VS 网站资源防盗链的:破解技巧
1 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问! 1 资源被盗链:(简明定义) 下载者不是从你的网站直接下载资源,而是通过其他盗链网站提供的你的下载资源链接进行下载你的服务 ...
- Python Learning Paths
Python Learning Paths Python Expert Python in Action Syntax Python objects Scalar types Operators St ...
- node应用层中间件使用
var express = require("express") var path = require("path") var app = express() ...
- 通过const app = getApp()实现在 page 页面获取 app.js 定义的属性globalData,即获取全局数据
App.js是项目的入口文件,页面的 page.js 文件会覆盖 app.js文件, App.js文件里面的一些方法: onLaunch : function(){}:这个方法是当小程序加载完毕后就执 ...
- 频繁的或者大范围的来实现数据的共享要使用Vuex
一. Vuex 概述 1.1 组件之间共享数据的方式 由于使用频繁,通常将v-bind:属性名=" "的格式简写成:属性名=" ".兄弟组件之间的共享即不相干组 ...
- SpringBoot配置本地文件映射路径
1.前言 在springboot的项目中,如果需要通过项目方式访问本地磁盘的文件,不仅可以使用nginx代理的方式,还可以使用springboot配置的方式进行访问. 实例原因说明:由于上传的图片是要 ...
- CSS实现页面切换时的滑动效果
最近在开发手机端APP页面功能时遇到一个需求:某个页面查询的数据有三种分类,需要展示在同一页面上,用户通过点击分类标签来查看不同类型的数据, 期望效果是 用户点击标签切换时另一个页面能够以一个平滑切入 ...
- 卧槽,好强大的魔法,竟能让Python支持方法重载
1. 你真的了解方法重载吗? 方法重载是面向对象中一个非常重要的概念,在类中包含了成员方法和构造方法.如果类中存在多个同名,且参数(个数和类型)不同的成员方法或构造方法,那么这些成员方法或构造方法就被 ...