Java内存使用保持在最大堆大小内,但我的系统内存正在慢慢被消耗

Java内存使用保持在最大堆大小内,但我的系统内存正在慢慢被消耗,java,macos,memory,memory-leaks,Java,Macos,Memory,Memory Leaks,我对Java编程比较陌生,所以请容忍我试图理解这里发生了什么 我开发的应用程序使用的最大堆大小为256MB。随着GC的完成,我在这方面从未遇到任何问题。在加载大映像时,使用的堆会建立起来,在卸载映像时会很好地释放。内存不足的错误我还没有看到 然而。。。运行应用程序大约一个小时。我注意到进程使用了越来越多的系统内存,而这些内存永远不会被释放。因此,应用程序从使用160MB开始,随着堆大小的增加而增加,但当堆大小缩小时,所使用的系统内存会不断增加。直到进程使用2.5GB,我的系统开始变慢 现在我正试

我对Java编程比较陌生,所以请容忍我试图理解这里发生了什么

我开发的应用程序使用的最大堆大小为256MB。随着GC的完成,我在这方面从未遇到任何问题。在加载大映像时,使用的堆会建立起来,在卸载映像时会很好地释放。内存不足的错误我还没有看到

然而。。。运行应用程序大约一个小时。我注意到进程使用了越来越多的系统内存,而这些内存永远不会被释放。因此,应用程序从使用160MB开始,随着堆大小的增加而增加,但当堆大小缩小时,所使用的系统内存会不断增加。直到进程使用2.5GB,我的系统开始变慢

现在我正试图了解幸存的几代人。堆的大小和幸存的几代人之间似乎没有真正的联系?我的应用程序建立了许多幸存的代,但根据应用程序本身使用的内存,我从不耗尽内存。但是JVM一直在消耗内存,从不将其返回给系统

我在网上搜索,有时会找到一些有用的信息。但我不明白的是,应用程序保持在堆大小边界内,而且我的系统内存仍在被占用

这是怎么回事


我在OSX Lion上使用的NetBeans IDE提供了最新的1.6 JDK。

最好的启动方式是从同一台机器上的JDK上启动
jvisualvm
。连接到正在运行的程序并启用评测

另一种选择是尝试在调试模式下运行应用程序,并偶尔停止它以检查数据结构。这听起来像是一种不正常的/奇怪的做法,但通常情况下,如果你有内存泄漏,它在哪里就会变得非常明显


祝你好运

你试过用VisualVM戳你的应用程序吗?它应该有一个查看堆转储的工具,也许知道旧一代占用了哪些对象会有所帮助。你确定你正确地处理了所有资源吗?某些类(例如ImageReader)可以保留一些本机资源,当对象本身在JVM中收集时,这些资源不会自动释放。通常,您需要使用finally块来确保这些资源被释放。所以您有一个256m的-Xmx,但是进程大小增加到了2.5gb?哇!我从未见过这种行为。您使用了多少线程?我一直在使用NetBeans探查器进行评测,它实际上与jvisualvm的功能有些相同。Windows PC上的堆大小保持在64MB以下,而堆大小不受限制。在OSX上,堆大小现在增长到最大128MB。然而。。。系统使用的内存仍在不断增长。根据剖析器,有几个幸存的世代,图中幸存的世代仍然在继续增长。这是一个动态应用程序。对象不断地被创建和丢弃。