Java 垃圾回收GC
2017-05-24 16:04
148 查看
1、我们都知道JVM中的栈和计算器是线程私有的,及栈的生命周期是和线程的生命周期一样的,而栈中存储的还包括java的基本数据类型(boolean、byte、char、short、int、float等等)。
2、类加载器读取完毕类对应的字节码文件时就已经能确定这个类型的大小了。
基于1、2俩点来提出正文内容。
年轻代区还分为Eden区和俩个Survivor区,所有新创建的对象都在Eden区,Eden区满后会触发minorGC将Eden区扔存活的对象复制到其中一个survivor区,另一个survivor区也将存活对象复制到这个survivor区中,尽量保持一个survivor区是空的。
老生代区存放的是年轻代区触发minorGC后仍存活的对象;年轻代的Eden区满后会放到survivor区中,如果survivor区还是存放不下这些对象,GC收集器会将这些对象直接放到老生代区;如果老生代区也满了那么将会触发FullGC回收整个堆内存。
永生区存放的主要是Class对象,如果一个类频繁的被加载可能会导致永生区满,永生区的垃圾回收是由FullGC负责的。 (永生区对应在堆划分中的方法区)
VisualGC插件可以查看每个代的当前内存大小和回收的次数。
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插件可以查看每个代的当前内存大小和回收的次数。
相关文章推荐
- Java中的垃圾回收机制GC
- java垃圾回收之Minor GC和Major GC
- Java GC(垃圾回收)
- 成为JavaGC专家Part I — 深入浅出Java垃圾回收机制
- java垃圾回收GC
- 成为JavaGC专家Part II — 如何监控Java垃圾回收机制
- Java中垃圾回收机制(GC)
- java垃圾回收那点事(二)究竟有多少GC
- 成为Java GC专家系列(3) — 如何优化Java垃圾回收机制
- java中垃圾回收机制(GC)
- Java GC(垃圾回收)
- java分代垃圾回收算法(GC)
- Java 垃圾回收 GC
- Java性能优化:垃圾回收(GC) (转文)
- JAVA gc垃圾回收机制
- java中垃圾回收机制(GC)
- java中垃圾回收机制(GC)
- java垃圾回收那点事(四)谁执行了GC的任务
- Java GC(垃圾回收)
- Java -- Hotspot虚拟机调优与GC垃圾回收策略