续jna的坑后,再来谈谈 finalize()怎么用
2015-12-27 13:20
453 查看
首先你得知道:
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
注:比较匆忙比较乱 有缘者看之
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
注:比较匆忙比较乱 有缘者看之
相关文章推荐
- View的事件体系
- java标准库中优先队列的使用
- 如何正确使用equals方法?
- NOIP2015解题报告 By ljt12138
- Leetcode: Game of Life
- HDOJ-----1576拓展欧几里德
- Python之email
- Android Studio目录结构浅析
- 通过闪烁标题实现“消息提示”
- git 使用(二)
- 编程之美 - 将帅问题
- Note for video Machine Learning and Data Mining——Linear Model
- ubuntn 安装深度音乐
- Java多线程之ThreadGroupDemo
- Windows编辑类
- linux中怎样设置DHCP
- ERROR 1813 -Mysql:Tablespace for table 'xxx`.'xxx` exists.
- 记忆化搜索求解区间型dp
- find命令
- SAN简介