返回信息流本人最近在研究JVM的运行机制,JVM的内存区域按照存放数据的不同可以分为方法区、堆、栈、本地方法区和程序计数器。但是JVM的内存调优之中又将内存分为永久代、年老代和年轻代。这两个划分方法之间是什么关系,既然已经分区,为何又分代?
这是一条镜像帖。来源:北邮人论坛 / java / #58772同步于 2018/4/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
【问题】JVM内存区域和分代的关系?
gxlihao
2018/4/1镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
JVM内存划分主要是从线程私有和共享的角度来的,我们把整个JVM内存划分出一块用来放线程共享的数据,再划分出一块为每个线程私有,之所以这样是JMM规定的,划分出来的这一个个区域就像是一个班级。但是线程私有的内存区域会随着本线程的终结而消失,但是线程共享的内存区域要在整个JVM进程终结才会清零,但是,一个应用在执行的时候,尤其是服务进程在对外提供服务的时候,想象如果进程终结了,那么会造成难以挽回的损失,但是,随着进程的执行,会频繁的new一些对象出来,这些是要占据内存的,而可用的内存是一定的,所以这时候就需要把那些已经不再需要的”垃圾”给清理掉,那就是所谓的GC!那么在进行GC的时候,如果每次都把整个堆内存作为GC目标的话,那么势必会造成很多无效的操作,这是跟据不同的GC算法来的,所以为了最大限度的提升GC的性能,我们new的对象只能分配在内存的某一个区域里,随着对存活时间的增加,会将这些对象移动到其他其他区域,其他区域的划分也是根据具体的GC算法来的
来自 缘邮
你说的这个把对象new在一定的区域应该是特指某种垃圾回收算法吧,比如复制回收算法,而对于类似于标记整理算法则不一定吧。那么是不是说对于内存分代而言,仅仅适用于复制一类的垃圾回收算法,对于标记一类的则没有?
【 在 xlrainy (xlrainy) 的大作中提到: 】
: JVM内存划分主要是从线程私有和共享的角度来的,我们把整个JVM内存划分出一块用来放线程共享的数据,再划分出一块为每个线程私有,之所以这样是JMM规定的,划分出...
: 来自 缘邮
别混淆。
前者,比如常量池、方法区什么的,都是从JVM的结构上说的。但实际实现中,不一定会真的有这些结构。
后者:年轻代、老年代什么的,和JVM没有直接的关系,这是“分代垃圾回收算法”的一部分。而HotSpot JVM到8版本为止,默认的垃圾回收器都是并行的分代垃圾回收器。9开始,G1才是默认的垃圾回收算法,它是个分块的算法,不再是简单地按年轻代、老年代这样分了。
【 在 gxlihao 的大作中提到: 】
: 那么哪些是年纪范畴,哪些是班级范畴?
那么你说的在实际实现中不一定会有这样的结构是指在什么情况下?
【 在 nuanyangyang (暖羊羊) 的大作中提到: 】
: 别混淆。
: 前者,比如常量池、方法区什么的,都是从JVM的结构上说的。但实际实现中,不一定会真的有这些结构。
: ...................
不指什么情况下。这是JVM实现者的自由。比如某个JVM的实现可能根本没有一块区域专门用来存放常量。而你除非读那个JVM的源代码,否则你无法从外部行为上知道。即使如此,这也是个完全合规的JVM,因为JVM规范没有规定接口让用户知道常量池是否存在。
【 在 gxlihao 的大作中提到: 】
: 那么你说的在实际实现中不一定会有这样的结构是指在什么情况下?