首先你得知道:
java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。
(1).对象不一定会被回收。
(2).垃圾回收不是析构函数。
(3).垃圾回收只与内存有关。
(4).垃圾回收和finalize()都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的。
finalize 一般是用来处理,非java资源,比如在一个java class里调用了 C的malloc 申请资源,就需要对应的free。 这个free就可以放在 finalize()中
但这一切依然是不可以靠的, 在jna的坑中我们知道, 某java对象memory 可以用jni native 方法malloc申请很多 C对象 从而占据大量的 java进程中 native heap的 内存,但是这部分内存是不占据jvm heap的,导致java Gc线程认为jvm heap足够 无需浪费资源去 做Gc,导致 memory 无法调用 finalize()从而无法释放 native heap中的C代码对象。导致一定程度的内存泄漏。
如何解决?
看来只有自己显式 去调jni 去free了
可以参考 nio中 利用PhantomReference去知道对象状态,从而显示释放 线程的内核 内存。
再总结多说一句,finalize 实在不那么靠谱。 基本可以放弃使用
System.gc 是不会强制命令 jvm去做gc的 也只是建议。
gc没有渠道,可以 人为显式精确触发
System.runFinalizersOnExit() 方法部分地解决了这个问题,但是是process 退出时 回收。refer to http://blog.csdn.net/carolzhang8406/article/details/6705831
注:比较匆忙比较乱 有缘者看之