JVM学习系列:了解JVM options参数配置 & 看懂GC日志

简介: 了解JVM options参数配置 & 看懂GC日志

摘要

java有内置的垃圾回收器做内存回收,通过强引用、软引用、弱引用和虚引用给对象做"标记",告诉垃圾回收器在什么时机回收什么内存。我先通过JVM options参数探测JVM内部不同垃圾回收的策略。

JVM初始参数

  • minimum size of heap:10MB
  • maximum size of heap:20MB
  • new size of heap:5MB
-Xms10m -Xmx20m -Xmn5m -XX:ReservedCodeCacheSize=240m -XX:+UseCompressedOops -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:./gclogs

JVM初始内存分配:

image
截图是以空main方法运行后JVM的内存使用概要。新生代内存大小为5MB,PSYoungGen区可用内存大小为4608K,eden、from和to区分别为4MB、512K和512K;老年代可用内存大小为5120K。

所需分配的内存小于新生代大小

// ONE_MB_SIZE = 1024 * 1024
byte[] allocate1 = new byte[ONE_MB_SIZE];

image
创建allocate1数组在eden区分配了4096KB*0.25=1MB内存。

所需分配的内存大于新生代大小:

byte[] allocate1 = new byte[3 * ONE_MB_SIZE];

JVM将3MB的对象放到了老年代:
image
为什么JVM不GC然后在新生代上分配3MB空间?这和内存分配与回收策略有关:

* 对象优先在eden区分配
* 大对象直接进入老年代
* 长时间还活着的对象进入老年代

即:

  • 新生代初始36%的内存空间没有可GC的空间。
  • 新生代的eden+from剩余3.1MB,足以提供3MB空间,但内存按page分配(4K/page),如果在新生代分配会使得对象分开保存在不同的区(eden和from),是否存储对象的内存只能在一个区里,这点待验证。
  • 垃圾收集器为保吞吐量,当新生代无足够内存时,把对象分配到了老年代。

GC/Full GC

初始我们给heap分配了最大20MB的内存空间,下面看下GC的场景。
image
此时发生了GC和Full GC:
image
刨除初始被占用的36%的eden区,20MB的heap大小不满足内存分配要求,触发了java.lang.OutOfMemoryError: Java heap space错误。

此时将allocate1=null,触发GC,heap刚好可以完成内存分配。此时是在释放了eden空间后,转移到老年代进行内存分配:
image

看懂GC日志

To be continued...

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
26天前
|
监控 Serverless 数据库
Serverless 应用引擎常见问题之biphon-education-配置了SLS后一直重启如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
28 5
|
1月前
|
存储 JSON 监控
可以通过配置Filebeat来将Higress日志持久化到磁盘
【2月更文挑战第10天】可以通过配置Filebeat来将Higress日志持久化到磁盘
27 4
|
2月前
|
Java
flume的log4j.properties配置说明
flume的log4j.properties配置说明
|
2月前
|
Oracle Java 编译器
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)
46 1
|
1月前
|
运维 监控 数据可视化
九、GC收集日志
九、GC收集日志
34 4
九、GC收集日志
|
2月前
|
应用服务中间件
weblogic配置、修改日志保存目录、配置滚动日志
weblogic配置、修改日志保存目录、配置滚动日志
|
2月前
|
SQL 关系型数据库 MySQL
MySQL技能完整学习列表11、日志和备份——1、查看日志——2、数据备份和恢复(mysqldump, mysqlbinlog)
MySQL技能完整学习列表11、日志和备份——1、查看日志——2、数据备份和恢复(mysqldump, mysqlbinlog)
45 0
|
2月前
log4j2.xml的日志打印配置
log4j2.xml的日志打印配置
28 0
|
2月前
|
算法 Java
深入理解JVM - 解读GC日志
深入理解JVM - 解读GC日志
50 0
|
3月前
|
Oracle IDE Java
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)(下)
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)
36 1

热门文章

最新文章