- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
如题,最近在网上看到了一个某大厂的面试题:“新生代为什么分三块区域且比例为什么是8:1:1"?网上答案比比皆是,我是没搜到什么有价值的答案,今天结合这个题目谈谈自己的粗浅想法,如有不对还望指正;另外需要说明的是,接下来聊的都是基于G1之前的垃圾收集器; 首先,我们假设新生代如果不分代会发生什么:如果不分代的话那么堆内存就是由一块新生代,一块老年代组成,当发生mionrGc时,收集器不管采用的是古老的Serial还是Parallel Scavenge,都会使用标记-复制算法将新生代中存活的对象直接复制到老年代;这时候会产生如下问题:
tips 正常情况下,对象何时进入老年代呢? 1、对象熬过一定的垃圾回收次数(不同的收集器要求不同,最大不会超过15)后进入老年代 2、动态年龄判定:新生代每次进行垃圾回收时,当e+s0或1区对象复制到另一个s1或0区时,会将对象年龄按从小到大的顺序进行累加,当对象大小累加到超过s1或0区的目标存活率时(默认50%),年龄大于等于当前计算对象年龄的对象直接进入老年代 3、分配在eden区的对象是大对象时直接到老年代分配 。
所以由上可得,新生代必须分代,此时我们假设将新生代分成一个e区一个s区,如图: 我们来看下在此分代模式下进行mionrGC会发生什么,第一次gc时存活对象由e区进入s区然后清空e区,此时老年代也可以起担保作用,一切看起来都很正常;但是如果再发生第二次gc会怎样呢,此时e区有存活对象,而容纳第一次gc时存活对象的s区也肯定会有存活对象,此时需要将e,s区的存活对象复制到老年代;此时,问题也就显而易见了,与不分代的时候情形一样了,对象只能进入老年代; 所以我们要将新生代再开辟一块区域来当作一个拦截器,不让不达年龄的对象直接接入老年代;结构如图: 此时新生代分成了e区,s0区和s1区;这时候再发生mionrGc就不会有上面出现的问题了:第一次GC时存活对象由e进入s0,然后清空e区;第二次gc时将e区和s0区的存活对象复制到s1区,清空e区和s0;第三次将e区和s1的对象复制到s0,清空e和s1......如此反复,直到对象年龄达标或者s区(s0或s1)容不下存活对象时再晋升到老年代,这样也就降低了老年代的压力,减少了fullGc的次数,
tips GC的分代假说: 1、弱分代假说:大部分对象都是朝生夕灭的 2、强分代假说:熬过越多次垃圾收集的对象越难被回收 3、跨代引用假说:跨代引用的对象相比同代引用属于极少数 。
接下来我们来讨论下为什么e:s0:s1默认是8:1:1? 根据<深入理解虚拟机>一书里的描述,IBM的一项研究表明新生代中有98%的对象是朝生夕灭的,换言之,每次mionrGC后存活的对象应该小于等于2%,所以看起来采用复制算法的新生代似乎可以不用将内存分成大小相等的两块了,但考虑到实验偏差以及实际情况的多样性,jvm默认预留了10%的内存用于存放存活对象,此时结合上文描述的,新生代最优应该分成三块,所以得再预留一块10%的内存给s区,那么自然剩下的80%就是e区的大小了; 。
最后此篇关于浅谈新生代为什么要分三块区域并且比例为什么是8:1:1的文章就讲到这里了,如果你想了解更多关于浅谈新生代为什么要分三块区域并且比例为什么是8:1:1的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
服务架构进化论 原始分布式时代 一直以来,我可能和大多数的人认知一样,认为我们的服务架构的源头是单体架构,其实不然,早在单体系
序列化和反序列化相信大家都经常听到,也都会用, 然而有些人可能不知道:.net为什么要有这个东西以及.net frameword如何为我们实现这样的机制, 在这里我也是简单谈谈我对序列化和反序列化的
内容,是网站的核心所在。要打造一个受用户和搜索引擎关注的网站,就必须从网站本身的内容抓起。在时下这个网络信息高速发展的时代,许多低质量的信息也在不断地充斥着整个网络,而搜索引擎对一些高质量的内容
从第一台计算机问世到现在计算机硬件技术已经有了很大的发展。不管是现在个人使用的PC还是公司使用的服务器。双核,四核,八核的CPU已经非常常见。这样我们可以将我们程序分摊到多个计算机CPU中去计算,在
基本概念: 浅拷贝:指对象的字段被拷贝,而字段引用的对象不会被拷贝,拷贝对象和原对象仅仅是引用名称有所不同,但是它们共用一份实体。对任何一个对象的改变,都会影响到另外一个对象。大部分的引用类型,实
.NET将原来独立的API和SDK合并到一个框架中,这对于程序开发人员非常有利。它将CryptoAPI改编进.NET的System.Security.Cryptography名字空间,使密码服务摆脱
文件与文件流的区别(自己的话): 在软件开发过程中,我们常常把文件的 “读写操作” ,与 “创造、移动、复制、删除操作” 区分开来
1. 前言 单元测试一直都是"好处大家都知道很多,但是因为种种原因没有实施起来"的一个老大难问题。具体是否应该落地单元测试,以及落地的程度, 每个项目都有自己的情况。 本篇为
事件处理 1、事件源:任何一个HTML元素(节点),body、div、button 2、事件:你的操作 &
1、什么是反射? 反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。 Oracle 官方对
1、源码展示 ? 1
Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信息。
可能大家谈到反射面部肌肉都开始抽搐了吧!因为在托管语言里面,最臭名昭著的就是反射!它的性能实在是太低了,甚至在很多时候让我们无法忍受。不过不用那么纠结了,老陈今天就来分享一下如何来优化反射!&nbs
1. 前言 最近一段时间一直在研究windows 驱动开发,简单聊聊。 对比 linux,windows 驱动无论是市面上的书籍,视频还是社区,博文以及号主,写的人很少,导
问题:ifndef/define/endif”主要目的是防止头文件的重复包含和编译 ========================================================
不知不觉.Net Core已经推出到3.1了,大多数以.Net为技术栈的公司也开始逐步的切换到了Core,从业也快3年多了,一直坚持着.不管环境
以前面试的时候经常会碰到这样的问题.,叫你写一下ArrayList.LinkedList.Vector三者之间的区别与联系:原先一直搞不明白,不知道这三者之间到底有什么区别?哎,惭愧,基础太差啊,木
目录 @RequestParam(required = true)的误区 先说结论 参数总结 @RequestParam(r
目录 FTP、FTPS 与 SFTP 简介 FTP FTPS SFTP FTP 软件的主动模式和被动模式的区别
1、Visitor Pattern 访问者模式是一种行为模式,允许任意的分离的访问者能够在管理者控制下访问所管理的元素。访问者不能改变对象的定义(但这并不是强制性的,你可以约定为允许改变)。对管
我是一名优秀的程序员,十分优秀!