分享好友 最新动态首页 最新动态分类 切换频道
java架构之路-(JVM优化与原理)JVM的对象和堆
2024-12-26 19:57

  上次博客,我们说了jvm运行时的内存模型,堆,栈,程序计数器,元空间和本地方法栈。我们主要说了堆和栈,栈的流程大致也说了一遍,同时我们知道堆是用来存对象的,分别年轻代和老年代。但是具体的堆是怎么来存放对象的呢?什么时候可以将对象放置在老年代呢。下面我来看一下。

 

 

 如果都为默认设置,大致就是这样的。假设我们设置内存堆的大小为600M,那么老年代就大概是400M,我们的年轻代就是200M,然后年轻代的eden区域占160M也就是200M的8/10,一般新建的对象都在这,我是说一般啊。后面会用这个600M来详细说明,from和 to区域各占20M,也就是Survivor区域占用40M,每次做完minor GC,对象就放在这个区域。

  我刚才说到,有时候对象不在年轻代,那么我来具体分析一下,什么情况放置在年轻代,而什么时候又放置在老年代。

1,Minor GC之后,存活的对象Survivor区域放不下。

加入堆内存日志,我们得到打印结果为:

   我们得到bt1新建以后,我们的堆内存几乎占满了,现在已经99%了,那么我们再来看一下。

从代码里我们可以得知,我们新建了bt1之后又新建了bt2,这时我们的eden区域应该不够用了,那么我们的内存会怎么来处理呢。我们来看一下结果

  我们可以看到已经做了一次GC了,但是还是放不下,那么我们直接将较大的对象直接放置在了堆内存上。

2,长期存活的对象移到老年代。也就是经过多次minorGC以后,对象还是存活的,我们将该对象移置老年代,一般是15次,也就是对象头内的分代年龄达到15岁时,我们将该对象移置老年代。

3,对象动态年龄判断。

  这个很重要的一个理论知识,大概来说一下,当我们做完minorGC以后,对象放在to区域,也就是我们Survivor的to区域,可能对象是放不下的,这时会来计算分类年龄,大致是这样来算的将所有分代年龄为1的相加,再加上分代年龄为2的,再加分代年龄为3的,依次相加,一直加到最大的分代年龄,但在相加过程中,你会发现加到分代年龄为m的对象,总大小已经放满了to区域,这时就将m到n分代年龄的对象都移置到老年代,包含m。也就是大于Survivor区域的50%时,则后面的对象,包含该年龄的对象都放置在老年代。

4,大对象直接放在老年代。再来看段代码。

  上面我知道我们创建一个大概600M的对象放置在eden时,占了99%,那么我们创建大于600M的对象,eden一定放不下了。那么直接放置在老年代。这里参数也是可以设置的。我来设置一个参数再看看,设置参数为

-XX:PretenureSizeThreshold=10000000 -XX:+UseSerialGC -XX:+PrintGCDetails   

   我们设置了参数,声明10M的对象就为大对象,我们创建了一个大概20M的对象,就直接放置在了老年代上。就是对象经历那么多次的minorGC了,jvm虚拟机会认为你可能会一直存活,趁着这次放不下了,你就趁早过来吧,来我们老年代混吧。

5,老年代空间分配担保机制。

 

 我来解释一下上面那个五彩缤纷的图。等我们的eden区满时,需要进行minorGC,这时会优先看一下老年代的剩余空间大小,如果老年代剩余的空间不多了,我们就可能进行full GC,也就是我们老年代的剩余空间小于我们的eden区内将要进行minorGC对象的总和。

如果真的小了,那么我们往下走,我们会判断时候配置了-XX:-HandlePromotionFailure (jdk8以上默认设置)这个参数,如果没配置,直接进行fullGC,如果配置了就去判断老年代的剩余空间是否小于我们每次minorGC后每次要放在老年代对象大小的平均值,如果老年代小于minorGC了,那么进行fullGC。否则不需要进行full GC。

eden和Survivor(from和to)默认比例是8:1:1,但是jvm可能会将我们的参数优化,也就是-XX:+UseAdaptiveSizePolicy这个默认参数,我将其改为-XX:-UseAdaptiveSizePolicy不进行优化,保持8:1:1的比例了。

  我们再来看一下什么样的对象是可以被回收的。

1,引用计数法(基本不用,循环引用对象永远无法销毁,可能内存溢出)

  给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加1;当引用 失效,计数器就减1;任何时候计数器为0的对象就是不可能再被使用的。 

2,可达性分析算法。

  这个算法的基本思想就是通过一系列的称为 “GC Roots” 的对象作为起点, 从这些节点开始向下搜索,找到的对象都标记为非垃圾对象,其余未标记的对象都是垃圾对象

3,常见的引用类型。

  java的引用类型一般分为四种:强引用、软引用、弱引用、虚引用 

  一般将对象用SoftReference软引用类型的对象包裹,正常情况不会被回收,但是GC做完后发现释放不出空间存放新的对象,则会把这些软引用的对象回收掉。软引用可用来实现内存敏感的高速缓存。 

4,finalize最终判断对象存活。

  finalize是在对象马上要被收回之前运行的最后一个方法,可以写逻辑,但是完全不建议去这样去写,很可能出现对象永远不会被回收,造成内存溢出,也就是说在finalize方法内还可能“救活”我们的对象。

最新文章
西弗吉尼亚州弗拉特伍兹怪物现身新动漫剧
西弗吉尼亚州的弗拉特伍兹(据 WBOY 报道)——由于其最近在网飞和葫芦网的新动漫系列《Dan Da Dan》中现身,西弗吉尼亚州的弗拉特伍兹怪物本周备受关注。该节目的第一集于本月初播出,是改编自 2021 年首次发布的原创漫画。这个故事主要围
陕西省总工会网上信访系统建设及与12351服务职工热线系统融合项目竞争性磋商公告
合同包1(网上信访系统建设及与12351服务职工热线系统融合项目)特定资格要求如下:(1)供应商为响应招标并参加投标的合法注册的企业法人(或其分支机构)、事业法人、其他组织或自然人,具有独立承担民事责任的能力。企业法人应提供合法有效的
无限类小说17本,无限轮回,穿梭万界,揭秘宇宙深处的终极秘密
1.《轮回乐园》【作者:那一只蚊子】【标签:衍生同人、无限流、热血、升级、智斗】【未完结】【字数:1367.81 万字】精彩的世界架构:小说构建了宏大且独特的轮回世界,主角苏晓穿梭于一个个动漫或小说的衍生世界中执行任务。每个世界都有
撸广告赚收益系统开发平台(小程序、源码、搭建)
大家都知道,广告领域一直是各大平台争夺之地。特别是那些大平台,竞争愈发激烈!百分之90以上的广告都集中在大平台的手上。撸广告赚收益系统开发,撸广告赚收益系统软件开发,撸广告赚收益系统开发案例,撸广告赚收益系统游戏开发搭建,撸
豆包概念股一览
周五豆包概念股27家涨停,炒作逻辑:字节跳动/火山引擎/豆包大模型将于12月18-19日上海举行《FORCE2024原动力大会》。大会将展示全新的豆包大模型,并打造2000平方米的AI展区,并举办10+场的专题论坛。字节豆包已成中国排名第一名的AIAPP。
通过web方式远程管理linux服务器
目录 1.安装cockpit 2.启动并设置开机自启 3.打开浏览器访问: (1)登录服务器 (2)将管理界面调为中文 (3)调出命令行 • 通过web界面来管理服务器 • 安装也非常的方便,只需安装启动即可不用麻烦的编译配置 • 可以监控服务
关键词挖掘工具网站
摘要:,,关键词挖掘工具网站是一种在线工具,能够帮助用户快速找到与特定主题相关的关键词和短语。这些工具通常通过分析搜索引擎的搜索结果和网站内容,提供有关关键词的流行度、竞争度和相关性的信息。这些信息对于网站优化和搜索引擎营
苹果safari浏览器怎么样修改默认搜索引擎?
要修改苹果Safari浏览器的默认搜索引擎,可以按照以下步骤进行操作:1. 打开Safari浏览器并点击窗口左上角的“Safari”菜单。2. 从下拉菜单中选择“偏好设置”选项。3. 在弹出的对话框中,点击“搜索”标签页。4. 在“搜索引擎”一栏中,可
高血压病 信息评论
网友评论245695 12345678910下一页尾页 ip:211.167.136.*2024-12-16 09:12:13 发表 ip:222.27.8.*2024-12-16 08:58:19 发表 ip:121.255.236.*2024-12-16 08:57:14 发表 ip:211.146.106.*2024-12-16 08:42:37 发表 ip:202.180.151.*2024-12-
介绍SEO软件,优化网站排名的秘密武器
随着互联网的普及,越来越多的企业开始重视网络营销,而搜索引擎(SEO)作为网络营销的重要组成部分,已经成为了企业提升品牌知名度和市场份额的重要手段。为了提高SEO效果,许多企业纷纷寻求SEO软件的帮助。本文将带您揭秘SEO软件,解析其
相关文章
推荐文章
发表评论
0评