jvm垃圾回收器(《深入理解java虚拟机》)

---恢复内容开始---

程序计数器、虚拟机栈、本地方法栈,这三个区域随着线程生,随着线程死。重复入栈出栈,还有基本确定 编译后 各区域所需要的内存大小是确定的。所以这部分回收不需要过多考虑。

主要回收对象为堆、方法区。java动态原则,大多数对象都是运行期间才会被加载的,所以堆上的容量是动态(分配和回收)变化的。

1.堆上回收内存(回收已死对象)

怎么判断已死?

每个类都有一个finalize()方法,,jvm判断一个对象是否死亡,先根搜索算法筛一遍,标记出不可达对象,,并放在一个队列中,由一个线程去逐个执行finalize()方法。若某个对象重写了finalize()方法,并且在此方法中成功讲自己连接出去了,,那就抹去标记,暂留狗命。若没有重写或没有成功推出自己,则只有等死。

finalize()方法,在一次次回收中,,只会被系统调用一次。(?)

finalize()一般被用在对象快死了,,释放被其占用的资源。但是 try finally  好像也可以。

2.方法区回收

这部分是有回收的,废弃的常量和 无用的类。

3.垃圾回算法

3.1标记回收

先标记再回收:可能产大量碎片,,没有可以被分配的连续内存,效率也底。

3.2复制算法

两块一样大的内存,,一块用的差不多的了,,将上面活着的对象复制到另一块上,,原来的清空。

 

3.3标记-整理算法

让存活的对象自己想某个区域”靠近“,,然后回收这个区域端边接意外的内存。

3.4分代收集算法

4.垃圾收集器

http://www.cnblogs.com/zuoxiaolong/p/jvm8.html

5.内存分配与回收策略

https://www.cnblogs.com/xiaoxi/p/6557473.html

原文地址:https://www.cnblogs.com/haerwang/p/10030718.html