博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM学习系列:了解JVM options参数配置 & 看懂GC日志
阅读量:6096 次
发布时间:2019-06-20

本文共 1140 字,大约阅读时间需要 3 分钟。

摘要

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 * 1024byte[] 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...

转载地址:http://yawza.baihongyu.com/

你可能感兴趣的文章
Java NIO与IO的差别和比較
查看>>
HTTP/1.1 中 If-Modified-Since 和 If-Unmodified-Since 区别简记
查看>>
怎样炒掉你的创业合作伙伴?
查看>>
[计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(一)...
查看>>
UNICODE编码表
查看>>
hadoop Mahout中相似度计算方法介绍(转)
查看>>
C语言嵌入式系统编程修炼之(三)内存操作
查看>>
IE和Firefox的Javascript兼容性总结
查看>>
c++ _int64 转成string
查看>>
Atitit. 悬浮窗口的实现 java swing c# .net c++ js html 的实现
查看>>
linux后台运行程序
查看>>
ADO,OLEDB,ODBC,DAO,RDO的区别说明
查看>>
RabbitMQ消息队列(一): Detailed Introduction 详细介绍[转]
查看>>
FDATool使用
查看>>
win7 vs2012/2013 编译boost 1.55
查看>>
LDAPserver的安装
查看>>
Android 通过广播来异步更新UI
查看>>
IIS7如何显示详细错误信息
查看>>
ViewPager切换动画PageTransformer使用
查看>>
meterpreter
查看>>