|
|
1
4
我认为你已经正确地诊断了:你从来没有耗尽Java堆,所以JVM不垃圾收集,并且映射的缓冲区没有被释放。手动运行GC时没有问题的事实似乎证实了这一点。您还可以启用详细收集日志记录作为辅助确认。 你能做什么?好吧,我首先尝试使用-xms命令行参数保持初始JVM堆的大小较小。如果程序总是在Java堆上分配少量内存,这会导致问题,因为它会更频繁地运行GC。 我也会用 PMAP 工具(或其在Windows上的等效工具)检查虚拟内存映射。通过分配可变大小的缓冲区,您可能正在分割C堆。如果是这种情况,那么您将看到每一个更大的虚拟地图,在“anon”块之间有间隙。解决方案是分配比您需要的更大的常量大小块。 |
|
|
2
8
你真的面对 a known bug in the Java VM . Bug报告中列出的最佳解决方法是:
其他可能的解决办法包括:
如果您真的想依赖直接字节缓冲区,那么我建议在应用程序级别使用池。根据应用程序的复杂性,您甚至可以简单地缓存和重用同一个缓冲区(注意多个线程)。 |
|
|
3
1
我怀疑你的问题是由于 直接的 字节缓冲区。它们可以被分配到Java堆之外。 如果您经常调用该方法,并且每次都分配小的缓冲区,那么您的使用模式可能不适合直接缓冲区。
为了隔离这个问题,我会切换到一个(Java)堆分配缓冲区(只使用
|
|
|
4
1
如果堆内存不足,将自动触发GC。但是,如果直接内存不足,则不会触发GC(至少在Sun的JVM上),即使GC释放了足够的内存,您也只会得到一个内存不足错误。我发现在这种情况下你必须手动触发GC。 更好的解决方案可能是重用相同的bytebuffer,这样就不需要重新定位bytebuffers。 |
|
|
5
1
自由直接
函数
而不是编写代码,例如C来调用Java中所说的函数,您可以使用
JNA
的
之后唯一剩下的就是放弃所有对
请注意,直接
我也不知道你能不能给一个直拨电话
下面是我的库中关于direct的一个稍微修改过的片段
|
|
|
caprica · 如何使用JNA映射从本机方法返回的结构化中的可变长度数组 10 年前 |
|
|
6azbljlb · JNA如何在从dll接收的指针中从java调用方法? 10 年前 |
|
|
Jonathan Beaudoin · Linux环境上的Java JNA 10 年前 |
|
|
Jire · JNA何时创建FromNativeContext?(垃圾吨) 10 年前 |
|
|
Ivan Tamashevich · JNA错误的结构字段值 11 年前 |
|
|
Jamie Reid · JavaH无法为JNI类创建C头文件 11 年前 |