---恢复内容开始---
程序计数器、虚拟机栈、本地方法栈,这三个区域随着线程生,随着线程死。重复入栈出栈,还有基本确定 编译后 各区域所需要的内存大小是确定的。所以这部分回收不需要过多考虑。
主要回收对象为堆、方法区。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