JVM垃圾回收算法

1标记-清除

标记存活对象,清理其他垃圾对象。
优点:效率高(只需要把其他位置擦掉)。缺点:产生碎片(碎片导致分配大对象时要整理成连续的)。




2标记-整理

标记之后,把其他垃圾对象清除,整理对象成连续存放。减少磁盘碎片。




优点:
没有碎片。
缺点:
效率低(对象在空间里频繁复制)。


3复制(要有对等内存空间保持为空)

需要两块相等的内存空间,一块内存保存为空。



标记存活对象后,直接复制到右边空的内存空间,清空全部左边空间




优点:效率高

缺点:浪费内存

垃圾对象

1从根对象出发,所有被引用的对象都是存活对象。
2其他对象,都是垃圾。
根对象:
1栈中的引用变量所引用的对象
2方法区的静态变量所引用的对象


栈存的是方法里面的局部变量或if代码块的局部变量

根对象是栈中的引用变量所引用的对象

根对象还是方法区的静态变量所引用的对象


蓝色是存活对象
粉色是垃圾对象

JVM的内存分区

1新生代
2老年代
3永久代(方法区)

1新生代(分三块)


-伊甸园
-生存区
--1 from
--2 to

1新建对象,在伊甸园分配内存
2伊甸园存满,复制到from
3from存满,复制到to,并交换角色
4对象在from,to之间复制15次,次数可指定参数配置(一般不需配置)
5晋升到老年代

老年代


使用标记-整理和标记-清除
间隔一段时间,会执行一次小范围的垃圾回收
当老年代空间占用到一定比例(一般是85%),会执行一次full-gc(完整垃圾回收-效率不高)

老年代使用的垃圾回收器

1 CMS(并发的标记-清除)
2 G1

CMS-并发的标记-清除
@运行效率高,STW(Stop The World-如果执行垃圾回收过程,STW可能会把虚拟机锁定,只允许垃圾回收器执行。你的代码会短暂地中断)暂停时间非常短暂。
CMS执行过程
1初始标记

只标记根对象(根对象数量有限-速度非常快,初始标记过程会引起STW)
2并发标记
垃圾回收器,与其他java程序并行执行。(你的程序还在执行)
3对象漏标记时,重新标记
只对并发标记没有标记的对象,重新标记,会引起两次STW时间
4并发清除
与其他java程序并行执行,把其他垃圾对象擦除,你的程序正常执行

jdk1.7后默认使用CMS。
CMS配置参数过多,可以详细配置新生代,老年代,永久带内存空间大小。但是使用过于复杂。

如果要详细配置内存区:
要让老年代内存空间内存要大。


老年代很多对象,长时间生存,这种长时间生存的对象,没有必要频繁扫描这段内存空间,它已经存活很长时间了。在未来更长时间内,很可能都不变成垃圾,这样预测的话,就不必对老年代对象频繁扫描。而在伊甸园新建的对象,刚刚创建的对象非常不稳定,可能很快就会变成垃圾,所以对新生代伊甸园的对象要频繁地扫描,伊甸园只要填满就扫描找垃圾,回收。所以这块空间要比较小,而且它有空白空间会浪费内存。而且它执行垃圾回收频繁地复制,空间太大,复制的内存块太大就会比较大

生存区要比伊甸园小。配置生存区更大好一些。让from放更多的对象以减少老年代的压力。

在伊甸园新建对象,分配内存

伊甸园被占满,标记存活对象

把存活对象放在from
并且伊甸园清空。用的是标记复制。
在伊甸园继续创建新对象,等伊甸园再满了,标记存活对象,把存活对象复制到from,伊甸园直接清空

from空间沾满

继续标记from当中的存活对象

复制到to

from中的对象清空

from和to颠倒

继续在伊甸园创建对象


伊甸园满了往from复制,存活对象被复制到from

标记其中的存活对象

继续向to复制

清空from
再交换角色

from-to来回复制,每次复制对象年龄加1,复制15次,晋升到老年代。


G1-GarbageFirst垃圾第一

内存被划分为几千个内存块,也有分代的划分。有的是伊甸园,有的是生存区,有的是老年代。这样划分,如果创建对象还是在伊甸园,伊甸园创建满了向生存区复制,生存区满了,在多个生存区之间来回复制,复制多次之后还可向老年代复制,老年代满了还可向另外一个老年代复制。所以现在执行的垃圾回收算法都是复制,没有清除整理,也不会产生碎片。(复制本身效率比较高)



所有的垃圾回收算法都是复制。

G1垃圾回收器会找到垃圾最多的内存快,优先回收。

G1的配置参数非常简单,只需要配置目标停顿时间(stw时间),G1会自动调整其他参数,来达到预期的停顿时间(一般不超过200ms)

现在虚拟机默认不是G1,如果你想用G1来代替CMS,那么你需要配置来使用。

G1的出现就是为了代替CMS,但是还有bug。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容