Ale*_*Che 7 java java-native-interface garbage-collection memory-management
项目:Java,JNI(C++),Android.
我将通过创建一个托管包装类来管理本机C++对象的生命周期,该类包含一个指向本机对象的指针(作为一个长成员),并将删除其中重写的finalize()方法中的本机对象.有关详情,请参阅此问题.
C++对象不消耗其他类型的资源,只消耗内存.对象的内存占用量不是很高,但它基本上高于Java中64位的长度.有没有办法告诉Java的GC,我的包装器不仅仅是一个很长的值,而且在运行垃圾收集之前创建数百万个这样的对象并不是一个好主意?在.NET中有一个GC的AddMemoryPressure()方法,正是出于这个目的.Java中是否存在等价物?
经过更多的搜索之后,我从IBM Research Center 找到了一篇不错的文章。
简要地说,他们建议对本机对象使用Java堆而不是本机堆。对于Java对象通过句柄引用的本机对象,这种方式对JVM垃圾回收器的内存压力更加逼真。
为此,需要重写默认的C ++堆分配和释放函数:operator new和operator delete。在new运算符中,如果JVM可用(已经调用了JNI_OnLoad),则该运算符将调用NewByteArray和GetByteArrayElements,这将返回所需的已分配内存。为了保护创建的ByteArray免受垃圾回收,还需要创建一个NewGlobalRef并将其存储在例如同一分配的内存块中。在这种情况下,我们需要分配所需的内存,再加上引用的内存。在运算符删除中,需要删除DeleteGlobalRef和ReleaseByteArrayElements。如果JVM不可用,则改用本机malloc和free函数。
| 归档时间: |
|
| 查看次数: |
584 次 |
| 最近记录: |