JVM系列(二) Java 堆内存分析
创始人
2025-05-31 11:47:35
0

Java 堆内存分析

堆是GC(垃圾收集器)执行垃圾回收的重点区域, 所以今天我们着重讲下堆内存

自己的项目,如果出现OOM或者出现内存泄露,一定是出在堆内存上,因为堆是JVM中最大的一块内存空间,所有线程共享Java堆,物理上不连续的逻辑上连续的内存空间,几乎所有的实例都在这里分配内存,在方法结束后,堆中的对象不会马上删除,仅仅在垃圾收集的时候被删除

1.JVM堆内存结构

堆的内存结构如下:
image.png

如果把JVM的堆 划分区间展开来说, 就是下面的图

image.png

Java7及以前将堆空间逻辑上分成三部分:

  • 新生区 eden+from+to
    • 年轻代又分为Eden和Survivor区。Survivor区由FromSpace和ToSpace组成。Eden区占大容量,Survivor两个区占小容量,默认比例是8:1:1
  • 老年区 Old
    • 较大的对象数据,年轻代存不下会放入老年代
    • 存活很久,没有被清除掉的对象也会放入老年代
  • 永久代 Perm
    • 永久代,也称为方法区,存储程序运行时长期存活的对象,比如类的元数据、方法、常量、属性等

Java8及以后将堆内存逻辑上分为:

  • 新生区 eden+from+to
    • 还是原来的逻辑新生代
  • 老年区 Old
  • 元空间 Metaspace
    • JDK1.8版本废弃了永久代,替代的是元空间(MetaSpace)
    • 元空间与永久代上类似,都是方法区的实现
    • 他们最大区别是:元空间并不在JVM中,而是使用本地内存
    • 参数-MetaspaceSize :初始化元空间大小,控制发生GC阈值
    • 参数-MaxMetaspaceSize : 限制元空间大小上限,防止异常占用过多物理内存

2.Java堆对象分代

为什么根据对象要分代 ?
将对象根据存活概率进行分类,对存活时间长的对象,放到固定区,从而减少扫描垃圾时间及GC频率。针对分类进行不同的垃圾回收算法,对算法扬长避短。

具体怎么分代?
JVM内存划分为堆内存和非堆内存,堆内存分为年轻代(Young Generation)、老年代(Old Generation),非堆内存就一个永久代(Permanent Generation)

  • 堆大小 = 新生代 + 老年代
    • 堆的大小可通过参数–Xms(堆的初始容量)、-Xmx(堆的最大容量) 来指定。
  • 新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域,又称作 from 和 to以示区分。
    • 默认的,Edem : from : to = 8 : 1 : 1 。(可以配置参数 –XX:SurvivorRatio 控制)
  • Eden区 占有 8/10 的新生代空间大小,from-to 各自占用 1/10 的新生代空间大小。
  • JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务
    • 所以无论什么时候,总是有一块 Survivor 区域是空闲着的。
  • 新生代实际可用的内存空间为 9/10 ( 即90% )的新生代空间。

为什么survivor分为两块相等大小的幸存空间?
主要为了解决碎片化。如果内存碎片化严重,也就是两个对象占用不连续的内存,已有的连续内存不够新对象存放,就会触发GC

怎么确定对象的归属哪一代

  • 新生成的对象首先放到年轻代Eden区,当Eden空间满了,触发Minor GC 清理年轻代
  • 存活下来的对象移动到Survivor0区,Survivor0区满后触发执行Minor GC 清理老年代
  • Survivor0区存活对象移动到Suvivor1区,这样保证了一段时间内总有一个survivor区为空。
  • 经过多次Minor GC仍然存活的对象移动到老年代。
  • 老年代存储长期存活的对象,占满时会触发Major GC=Full GC 清理整个堆空间,包括年轻代和永久代
  • GC期间会停止所有线程任务 STW , 等待GC完成,所以对响应要求高的应用尽量减少发生Major GC,避免响应超时。

3.JVM堆内存参数

参数示例描述说明
-verbose:gc控制台打印GC参数,一般都是自己测试时候用控制台输出
-XX:+PrintGCDetails触发GC时日志打印详细, 适合 线上,正式服务器打印gc日志
-Xms20M初始堆大小 20M
-Xmx20M最大堆大小20M 一般情况下-Xms和-Xmx这两个值设为相同大小
-Xmn10M新生代最大可用值10M, !!!注意采用 G1收集器不设置该参数
-XX:+PrintGC触发GC时日志打印
-XX:SurvivorRatio=8eden:from:to =8:1:1 也就是可用的也就90%
-XX:+HeapDumpOnOutOfMemoryErroOOM时生成Dump文件 dump文件便于我们分析oom
-XX:NewRatio=2新生代:老年代 = 1:2

有这这些参数,我们就可以在用用程序中配置JVM参数,从而得到我们想要的jvm配置,出了问题的时候也能够很快的定位问题

3.程序配置 打印GC参数及日志

设置JVM运行参数

-verbose:gc -Xms20M -Xmx20M  -Xmn10M -XX:+PrintGC -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:SurvivorRatio=8

下一篇,我们着重讲下 对内存的垃圾回收算法, 到底什么算堆内的垃圾对象, 垃圾到底是怎么被jvm回收的

上一篇:kubernetes CKA练习

下一篇:Java类和对象

相关内容

热门资讯

王凤英入职小鹏3年终获股权,此... 5月7日消息,小鹏汽车披露的监管及年报信息显示,公司总裁王凤英已正式进入股东名册,入职小鹏3年后股权...
五块钱红酒卖断货,便宜红酒为何... 最近一段时间,中国的酒类消费市场可以说是显得格外奇怪,一方面,各种高端酒特别是白酒的消费量出现了明显...
财联社C50风向指数调查:4月... 财联社5月8日讯(记者 夏淑媛)新一期财联社“C50风向指数”结果显示,市场机构对4月新增人民币贷款...
央视硬刚国际足联拒掏20亿,背... 作者| 史大郎&猫哥 来源| 是史大郎&大猫财经Pro 央视这次太刚了,离世界杯开幕还有1个月,死活...
新CEO上任直接放大招!Air... 快科技5月8日消息,苹果即将上任的CEO John Ternus对未来一系列新产品充满信心,称这些设...
“特朗普拟邀英伟达、波音等CE... 据路透社当地时间5月7日报道,特朗普政府正邀请英伟达、苹果、埃克森美孚、波音等大公司首席执行官,于下...
世界杯,还能看到直播吗? 2026年美加墨世界杯距离开幕,仅剩一个多月时间。多方信息显示,中央广播电视总台(以下简称“央视”)...
机构警告AI芯片热潮风险,超威... 5月7日,据央视财经,隔夜超威半导体公司(AMD)股价飙升近19%,带动AI芯片热潮持续升温。AMD...
银行员工转走储户1800万最新... 银行员工转走储户1800万最新进展:2名储户已收到银行全部款项
原创 中... 1994年,安徽省的经济格局曾发生过一次戏剧性的转折。在那一年,一座名为安庆的城市,其国内生产总值(...
昆都仑区:政策“蓄力”消费焕新 “一台5000多元的空调,叠加‘国补’和商场的以旧换新活动,能优惠1000元左右,旧机还能免费上门拆...
乐悦置业竞得佛山顺德乐从镇一商... 观点网讯:5月6日,佛山市顺德区乐从镇一商业地块成功出让,由广东省乐悦置业有限公司竞得,乐从南区·邻...
原创 亦... 《爱情没有神话》这部剧,一开始的命运颇为多舛,经历了几次撤档的波折后,终于在观众面前亮相,但其首播的...
美联储34年最大分歧叠加油价飙... 美联储按预期维持利率不变,但内部出现34年来最严重分歧,叠加布油创2022年6月以来新高,美债遭抛售...
支付宝消费券回收后,资金是否支... 摘要: 支付宝消费券回收变现后,资金能否直接转入信用卡?本文解答到账方式的相关规则,帮助用户了解资金...
中医介绍5个化痰穴位!收藏这篇... 很多人忽略了“痰”的危害,觉得咳几下就没事,殊不知,肺里的痰长期堆积,只会一步步加重身体负担。 中医...
黄金平台“杰我睿”涉嫌经济犯罪... 红星资本局5月7日消息,深圳水贝知名金店“杰我睿”兑付困难事件有了新进展。日前,深圳市公安局罗湖分局...
多地出台购房新政促楼市升温 记... 今年的“五一”假期,伴随着多个城市楼市新政密集落地,在叠加市场信心持续修复的作用下,房地产市场热度持...
谁是五一“吸金王”?这5座城市... 来源:市场资讯 (来源:21城市观) 哪座城市成为“五一”假期的大赢家? 图源:摄图网 作者|赵晓...
“低招低裁”格局稳固劳动力市场... 智通财经APP获悉,美国上周初请失业金人数在经历前一周回落至近几十年来最低水平后出现小幅反弹,表明尽...