JVM Memory Model And Garbage collector(一): 内存模型

JVM Memory Model And Garbage collector(一): 内存模型

这部分内容来自:

前言:

以前只通过看thinking in java的时候了解过垃圾回收,但是那里只谈论到了初步的两种模式。对于真正的JVM没有详细了解。希望可以通过这两篇文章,对JVM的内存模型和垃圾回收建立一个清晰的认识。

笔记内容目录:
  1. 内存模型
  2. 垃圾回收器算法
    • Serail
    • Parallel
    • Concurrment Mark Swap(CMS)
    • Garbage-First(G1)
  3. 检查问题及性能调优(这里留个坑)
内存模型

在java中,内存的分配和回收都是不用编程人员关心的。由JVM进行处理。我们可以假设一下,如果我们要做这个垃圾回收的话,怎么做。最初的想法,肯定是把内存中的object遍历一遍,看是否存活,存活就留下,死了就释放。这是最简单的方法。但回收的时候要注意如果application并没有停下来的话,那么你检查的就可能不准。比如你扫某个object的是存活的,但是扫过的时候又死了,这样就会不准确。并且有一个问题,在垃圾回收的时候肯定要是分布的,不能再扫一个就做一次操作。这样做的时候,有两个不利:对内存的操作很频繁,增加了处理的复杂度;并且无法从统一的高度上去重新安排内存,从而造成内存碎片。
所以不论在处理事情还是设计某个东西的时候,都是先认识、再识别分类处理。那么就可以对JVM的对象根据特点进行分类,大小、存活时间、类型。最后JVM选取分类的条件是大小、存活时间。对内存分成了两大块: Young 和 Tenured两类,其中Young又包括了Eden和两个survivor

为什么这么分?

上图是X轴是分配之后的byte存活时间,Y轴是存储时间的总字节数。从上图来看,young是占主要部分,并且会很快不再使用,只有少数部分会存活更久。

上图是具体的JVM分代图。

  • Eden(伊甸园): 这是object刚出生的地方,会在这里。
  • Survivor: 这是在对Young generation做清理的时候,在Eden中存活下来转移到这里。
  • Tenured: 这是Old generation,在Survivor经历几次垃圾回收会进来,然后还可能直接从Eden就进入(比较大的object)。

为什么需要两个Survivor?
One survivor space is empty at any time, and serves as the destination of any live objects in eden; the other survivor space is the destination during the next copying collection. Objects are copied between survivor spaces in this way until they are old enough to be tenured (copied to the tenured generation).

任何时间,都会有一个空的survivor空间。用来存储在收集的时候eden存活的对象。另外一个survivor是用来存储下一次存储存活的对象。对象在这两个suvivor空间里来回转存,直到他们变得足够久存放到tenured空间中。

也就是说: 当对Young进行回收的时候,会有一个empty的survivor。然后可以存储eden和另外一个survivor中存活的对象。之后清空另外一个survivor作为下一次存储Young的survivor的空间。这个有个图:

这里写图片描述

不是原图,在whitepaper中有一个原图,可以去看下.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值