您的位置:首页 > 编程语言 > Java开发

Java 垃圾回收GC

2017-05-24 16:04 148 查看
1、我们都知道JVM中的栈和计算器是线程私有的,及栈的生命周期是和线程的生命周期一样的,而栈中存储的还包括java的基本数据类型(boolean、byte、char、short、int、float等等)。

2、类加载器读取完毕类对应的字节码文件时就已经能确定这个类型的大小了。

基于1、2俩点来提出正文内容。

静态内存分配回收

在java编译的时候就已经确定需要的空间大小,系统一次性分配给它,之后并不会变化,局部变量包括的基本数据类型、对象的引用都是静态分配内存的。上面1、2点我也提到了,这个在执行结束之后自动会回收的,我们不需要太操心。

动态分配内存

java对象的空间都是动态分配的,执行过程中才能确定空间大小,什么时候回收不是确定的,这个才是我们要讨论的重头戏——JVM垃圾收集处理

如何检测垃圾

JVM做垃圾回收时会检查堆中的所有对象是否会被根对象直接或者间接引用,有引用的就是活动对象,否则就可以进行回收了。

基于分代的垃圾收集算法(Hotspot)

将堆总体分为三块区域:1、年轻代区 2、老生代区 3、永生区

年轻代区还分为Eden区和俩个Survivor区,所有新创建的对象都在Eden区,Eden区满后会触发minorGC将Eden区扔存活的对象复制到其中一个survivor区,另一个survivor区也将存活对象复制到这个survivor区中,尽量保持一个survivor区是空的。

老生代区存放的是年轻代区触发minorGC后仍存活的对象;年轻代的Eden区满后会放到survivor区中,如果survivor区还是存放不下这些对象,GC收集器会将这些对象直接放到老生代区;如果老生代区也满了那么将会触发FullGC回收整个堆内存。

永生区存放的主要是Class对象,如果一个类频繁的被加载可能会导致永生区满,永生区的垃圾回收是由FullGC负责的。 (永生区对应在堆划分中的方法区)

VisualGC插件可以查看每个代的当前内存大小和回收的次数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: