- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
项目:Java、JNI (C++)、Android。
我将通过创建一个托管包装类来管理 native C++ 对象的生命周期,该包装类将持有一个指向 native 对象的指针(作为长成员),并将在其重写的 finalize() 方法中删除 native 对象。参见 this question了解详情。
C++对象不消耗其他类型的资源,只消耗内存。该对象的内存占用不是特别高,但本质上高于Java中的64位long。有什么方法可以告诉 Java 的 GC,我的包装器不仅仅负责一个 long 值,而且在运行垃圾收集之前创建数百万个这样的对象不是一个好主意吗?在 .NET 中有一个 GC 的 AddMemoryPressure () 方法,正是为了这个目的而存在的。 Java 中有等效项吗?
最佳答案
经过更多谷歌搜索,我找到了一个 good article来自 IBM 研究中心。
简而言之,他们建议对 native 对象使用 Java 堆而不是 native 堆。通过这种方式,JVM 垃圾收集器上的内存压力对于通过句柄从 Java 代码引用的 native 对象而言更加真实。
为此,需要覆盖默认的 C++ 堆分配和释放函数:operator new 和 operator delete。在 operator new 中,如果 JVM 可用(已调用 JNI_OnLoad),则调用 NewByteArray 和 GetByteArrayElements,返回所需的已分配内存。为了保护创建的 ByteArray 不被垃圾收集,还需要为其创建一个 NewGlobalRef,并将其存储在例如在同一个分配的内存块中。在这种情况下,我们需要分配尽可能多的内存,加上引用的内存。在运算符删除中,需要删除全局引用和释放字节数组元素。如果 JVM 不可用,则使用 native malloc 和自由函数代替。
关于java - Java 中的 GC.AddMemoryPressure 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6716582/
C# AddMemoryPressure 调用是否会添加一个连接到它被调用的特定对象?我已经看到它在我们的性能跟踪中出现了很多,我想每 10MB 左右对调用进行一次批处理,但是如果它检查堆栈以将压力信
对非托管对象使用 Add/RemoveMemoryPressure 的正确方法是什么?我有一个非托管对象 - 但它大量使用了例如 STL 容器。我是否应该随着非托管对象总大小的每次变化不断更新托管 G
我在 MSDN 和 CLR via c# 上读到了这个问题。 假设我们有一个分配的 2Mb 非托管 HBITMAP 和一个指向它的 8 字节托管位图。如果它永远无法对对象做任何事情,那么用 AddMe
我正在使用第 3 方 COM DLL 使用 C# 编写应用程序,此 dll 在非托管内存中创建大量资源(如位图、视频、数据结构)。在四处挖掘时,我遇到了以下对垃圾收集器的调用: GC.AddMemor
项目:Java、JNI (C++)、Android。 我将通过创建一个托管包装类来管理 native C++ 对象的生命周期,该包装类将持有一个指向 native 对象的指针(作为长成员),并将在其重
我目前正在调试我们用来在系统中显示图像之前用特定文本标记图像的方法。 标签方法目前看起来像这样: private static Image TagAsProductImage(Image image)
已解决:原来受影响的机器安装了 .NET 4.5 beta。 我有一个使用 .NET4 的 C# 应用程序在对 的调用中无限期死锁/挂起 GC.AddMemoryPressure(12000000)
我们为一个用 C# 编写的多媒体匹配项目编写了一个自定义索引引擎。 索引引擎是用非托管 C++ 编写的,可以以 std:: 集合和容器的形式保存大量非托管内存。 每个非托管索引实例都被一个托管对象包装
我的 .NET 应用程序在很短的时间内使用了非常多的 RCW(不到一秒内使用了数千个 RCW)。我可以使用以下性能计数器来衡量此行为: - 处理 -> 处理计数 - .NET CLR 内存 -> #
我是一名优秀的程序员,十分优秀!