文档章节

简述JAVA内存分配与垃圾回收

玄影镜心
 玄影镜心
发布于 2015/06/09 23:58
字数 858
阅读 38
收藏 1


简单来说:堆 = 新生代 + 老年代 (Permanent忽略)

新生代:通常用来保存新生的对象。

老年代:1:保存年龄超过默认值的对象(默认15,可设置)、

             2:触发分配担保机制而提前存入的对象

             3:大对象(可设定,应避免使用大对象)

             4:忘了。。。以后补上

新生代与老生代的大小比例通常为1:2

新生代中划分为Eden和两个Survivor比例为8:1:1Eden区是连续的内存空间,因此在其上分配内存极快

    新生代中内存分配采取停止-复制算法,将新生代分为Eden和两个Survivor。新生对象保存在Eden中(大对象除外),当Eden空间被占满时,触发一次Minor GC,清除消亡的对象,之后Eden中还存活的对象年龄+1,并将其移动到其中一个Survivor中(此时,Survivor1是空白的,两个Survivor总有一个是空白的)(循环...),

    当Survivor0也满的时候,将其中仍然活着的对象直接复制到Survivor1,以后Eden区执行Minor GC后,就将剩余的对象添加Survivor1(此时,Survivor0是空白的)。

    若Survivor没有足够的空间放置对象,则触发分配担保机制将对象提前放入老年代中。(默认年龄超过15的对象则直接晋升老年代,为Survivor 腾出空间)

    老年代采用标记-整理算法标记出仍然存活的对象(存在引用的),将所有存活的对象向一端移动,以保证内存的连续。

     在发生Minor GC时,虚拟机会检查每次晋升进入老年代的大小是否大于老年代的剩余空间大小,如果大于,则直接触发一次Full GC,否则,就查看是否设 置了-XX:+HandlePromotionFailure(允许担保失败),如果允许,则只会进行MinorGC,此时可以容忍内存分配失败;如果不 允许,则仍然进行Full GC(这代表着如果设置-XX:+Handle PromotionFailure,则触发MinorGC就会同时触发Full GC,哪怕老年代还有很多内存,所以,最好不要这样做)。


分配担保机制触发过程:1:Minor GC----Survivor空间不足无法存放-----检查老年代空间----如果老年代空间不足则触发Full GC,如果足够则将Eden中年龄不足的对象转移到老年代。

------------------------------------

垃圾回收

1:可达性分析  : 通过引用链从顶向下搜索对象,若对象可达则忽略,若对象不可达则给予标记。

2:保存到“抢救队列”再下次GC时,被标记为不可达的对象将被先存放在一个Queue中。

3:检查且执行finalize:虚拟机用一个线程逐个检查该队列中对象的finalize方法,若finalize存在,且没有被运行过(该方法仅运行一次),则执行对象的finalize,如果在方法中对象重新获得了引用,则取消不可达标记,对象重新活跃。

4:生存or灭亡 :  若finalize方法执行后仍然处于不可达状态则对象被回收。

PS:java虚拟机不保证finalize的执行(完全不靠谱),所以最好不要使用该方法做想要的功能,编程时尽量忽略该方法。





© 著作权归作者所有

共有 人打赏支持
玄影镜心
粉丝 9
博文 90
码字总数 49460
作品 0
西安
高级程序员
私信 提问
Android 之 内存管理

概述 在android的开发中,要时刻主要内存的分配和垃圾回收,因为系统为每一个dalvik虚拟机分配的内存是有限的,在google的G1中,分配的最大堆大小只有16M,后来的机器一般都为24M,实在是少的...

等待流星
2014/03/08
0
0
Java GC系列:Java垃圾回收详解

Java的内存分配与回收全部由JVM垃圾回收进程自动完成。与C语言不同,Java开发者不需要自己编写代码实现垃圾回收。这是Java深受大家欢迎的众多特性之一,能够帮助程序员更好地编写Java程序。 ...

满风
2015/04/10
0
0
JVM性能优化, Part 1 ―― JVM简介

众所周知,Java应用程序是运行在JVM上的,但是你对JVM有所了解么?作为这个系列文章的第一篇,本文将对经典Java虚拟机的运行机制做简单介绍,内容包括“一次编写,到处运行”的利弊、垃圾回收...

梁杰_Jack
2014/10/30
0
0
Java虚拟机基础——4内存回收机制

Java虚拟机整体篇幅如下: Java虚拟机基础——1Java的内存模型 Java虚拟机基础——2JVM运行时数据区 Java虚拟机基础——3类加载机制 Java虚拟机基础——4内存回收机制 本篇文章的内容如下: ...

隔壁老李头
10/03
0
0
JVM内存分析及导致内存溢出的不健壮代码及解决办法

转自:http://hi.baidu.com/fvsd3/blog/item/9baec09a301bdebcc9eaf4a2.html 一、JVM内存区域组成 java把内存分四种: 1、栈区(stack segment)— 由编译器自动分配释放,存放函数的参数值,...

flynewton
2010/09/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java框架学习日志-7(静态代理和JDK代理)

静态代理 我们平时去餐厅吃饭,不是直接告诉厨师做什么菜的,而是先告诉服务员点什么菜,然后由服务员传到给厨师,相当于服务员是厨师的代理,我们通过代理让厨师炒菜,这就是代理模式。代理...

白话
42分钟前
6
0
Flink Window

1.Flink窗口 Window Assigner分配器。 窗口可以是时间驱动的(Time Window,例如:每30秒钟),也可以是数据驱动的(Count Window,例如:每一百个元素)。 一种经典的窗口分类可以分成: 翻...

满小茂
43分钟前
3
0
my.ini

1

architect刘源源
59分钟前
6
0
docker dns

There is a opensource application that solves this issue, it's called DNS Proxy Server It's a DNS server that solves containers hostnames, if could not found a hostname that mat......

kut
今天
5
0
寻找数学的广度——《这才是数学》读书笔记2700字

寻找数学的广度——《这才是数学》读书笔记2700字: 文|程哲。数学学习方式之广:国内外数学教育方面的专家,进行了很多种不同的数学学习方式尝试,如数学绘本、数学游戏、数学实验、数学步道...

原创小博客
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部