Java GC
Posted Run_dream
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java GC相关的知识,希望对你有一定的参考价值。
参考链接:http://www.cnblogs.com/hnrainll/archive/2013/11/06/3410042.html
1.Java中垃圾回收有什么目的?
垃圾回收的目的是识别并丢弃应用不再使用的对象来释放和重用资源。
2.Java GC机制主要完成3件事:确定哪些内存需要回收,确定什么时候需要执行GC,如何执行GC。
3.Java内存区域
线程共享的:1)堆区,堆区的存在是为了存储对象实例,原则上讲,所有的对象都在堆区上分配内存
2)方法区,方法区是各个线程共享的区域,用于存储已经被虚拟机加载的类信息、final常量、静态变量、编译器即时编译的代码
线程私有的:
1)虚拟机栈(一个线程的每个方法在执行的同时,都会创建一个栈帧)
2)本地方法区(虚拟机栈是执行Java方法的,而本地方法栈是用来执行native方法的
3)程序计数器(记录线程执行到第几行,JVM中唯一一个未定义OOME的区域)
4.Java对象访问方式:
一般来说,一个Java的引用访问涉及到3个内存区域:JVM栈,堆,方法区。
以最简单的本地变量引用:Object obj = new Object()为例:
- Object obj表示一个本地引用,存储在JVM栈的本地变量表中,表示一个reference类型数据;
- new Object()作为实例对象数据存储在堆中;
- 堆中还记录了Object类的类型信息(接口、方法、field、对象类型等)的地址,这些地址所执行的数据存储在方法区中;
5.Java内存分配机制:
Java内存分配和回收的机制概括的说,就是:分代分配,分代回收。对象将根据存活的时间被分为:年轻代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法区)
年轻代:对象被创建时,内存的分配首先发生在年轻代(大对象可以直接 被创建在年老代),大部分的对象在创建后很快就不再使用,因此很快变得不可达,于是被年轻代的GC机制清理掉,成为Young GC或Minor GC。
年轻代可以分为三个区:Eden(内存首次分配的地方),Survivor0,Survivor1
分配和回收机制:
1)绝大多数刚创建的对象会被分配在Eden区,其中的大多数对象很快就会消亡。Eden区是连续的内存空间,因此在其上分配内存极快;
2)当Eden区满的时候,执行Minor GC,将消亡的对象清理掉,并将剩余的对象复制到一个存活区Survivor0(此时,Survivor1是空白的,两个Survivor总有一个是空白的);
3)此后,每次Eden区满了,就执行一次Minor GC,并将剩余的对象都添加到Survivor0;
4)当Survivor0也满的时候,将其中仍然活着的对象直接复制到Survivor1,以后Eden区执行Minor GC后,就将剩余的对象添加Survivor1(此时,Survivor0是空白的)。
5)当两个存活区切换了几次(之后,仍然存活的对象,将被复制到老年代。
年老代:对象如果在年轻代存活了足够长的时间而没有被清理掉,则会被复制到年老代,年老代的空间一般比年轻代大,能存放更多的对象,在年老代上发生的GC次数也比年轻代少。当年老代内存不足时, 将执行Major GC,也叫 Full GC。
永久代:GC不会发生在永久代。
6.GC机制的基本算法是:分代收集。
新生代:停止复制
老年代:标记整理
7.System.gc()和Runtime.gc()会做什么?
答案:提示JVM进行垃圾回收。但是,立即开始还是延迟进行是取决于JVM的。
8.finalize()
当垃圾回收器决定回收某对象时,就会运行该对象的finalize方法。最主要的用途是是回收特定渠道申请的内存,用JNI(java Native Interface)调用non-Java程序,finalize()的工作就是回收这部分内存。
以上是关于Java GC的主要内容,如果未能解决你的问题,请参考以下文章
53.垃圾回收算法的实现原理启动Java垃圾回收Java垃圾回收过程垃圾回收中实例的终结对象什么时候符合垃圾回收的条件GC Scope 示例程序GC OutOfMemoryError的示例