在Java中有什么功能可以告诉运行时关于非托管内存分配,如GC.AddMemoryPressure method in .NET?Java内存压力
Java内存压力
回答
我想这在Java中不是必需的。 '如果一个小的托管对象分配了大量的非托管内存'可以简单地不会发生在Java中,如果您通过JNI调用本地(非托管)函数,内存不会分配给JVM的托管内存表。
参考:
严格地说,两个运行时系统对内存管理做出了不同的假设,Java/JRE简单地假设这不是很重要。 –
托管对象可以容纳大量的本机内存和少量的托管内存,因此对于gc它看起来很好,并且它不会收集那些对象。经过一段时间,本机堆已满并抛出OutOfMemoryException。这就像Deflater类的问题。我在http://www.devguli.com/blog/eng/java-deflater-and-outofmemoryerror/发现了这个问题。建议在那里手动调用end()方法。我认为这是一种必须避免使用垃圾回收器的交易(当使用gc时,我们不必担心内存释放问题) –
@Donal Fellows:你可以指向一些读物吗?我不想挑起那个声明,只是有兴趣! – home
直接存储器是用Java分开管理的,可以被视为 “非托管”。在Sun/Oracle JVM中,它有自己的内存使用限制,您可以一次达到堆大小和直接内存大小的限制。
在Sun/Oracle JVM中,您可以使用内部API显式释放直接内存块。这是罕见的,你甚至应该需要做,但这里是如何
ByteBuffer bb = ByteBuffer.allocateDirect(1024*1024);
((DirectBuffer) bb).cleaner().clean();
你可以这样做一万次,而不会触发GC。
顺便说一句:内存映射文件使用少量的堆,不计入直接内存限制。您可以映射的数量实际上是无限的。 (尽管在一个MappedByteBuffer中限制为2GB)
这与GC.AddMemoryPressure没有直接关系。这意味着重写应用程序以通过java执行所有本地内存分配。对于许多本地图书馆来说,这是不可接受的。 – yano
@yano希望您可以使用Java(或C#等其他高级语言)编写大部分代码,并且只需在本机代码中编写最小代码即可。 –
- 1. 带内存压力的SafeHandle
- 2. SQL中的内存压力通知CLR
- 3. .Net Web服务内存压力错误
- 4. 使用perf了解内存压力
- 5. 终止由于系统库内存压力和内存泄漏
- 6. 笔压力在闪存
- 7. 内存压力问题读取元数据并删除重复
- 8. 由于内存压力,AppDomain被标记为卸载
- 9. 内存压力在MonoTouch中加载一堆PNG图像
- 10. 多个视图控制器导致内存压力
- 11. 用C#测量内存压力/ GC执行情况
- 12. 由于“内存压力”导致的iOS UIImagePNGRepresentation崩溃
- 13. Apache Solr缓存<->压力测试
- 14. 压缩内存缓存
- 15. ASP.NET压力测试
- 16. HTML5压力测试
- 17. UDP广播压力
- 18. 压力测试AJAX
- 19. Jquery压力测试
- 20. expressjs压力测试
- 21. cuda注册压力
- 22. WebSocket压力测试
- 23. 内存压缩分配器
- 24. SharpZipLib不压缩内存流
- 25. SevenZipSharp - 压缩内存流
- 26. 内存压力是否会导致ASP.NET中的会话数据驱逐?
- 27. Solaris上的内存压力是否会导致JVM中出现SIGSEGV?
- 28. 如何在android中检测内存压力,内存回收攻击性或OOM杀死级别?
- 29. HttpClient超时缓慢压力
- 30. mod_wsgi在压力下失败
关于“质量标准”,这是什么东西? –
这是一个通过stackoverflow质量标准检查器的占位符文本。 –
@misha nesterernko占位符文本?如果这不是问题的一部分,那么它不需要在那里。 – berry120