Java应用程序内存使用

Jas*_*ins 7 java memory memory-leaks

我一直在写一个小的java应用程序(我的第一个!),目前只做了一些事情.目前,它运行Main类,它启动一个gui类(我编写的一个扩展JFrame的类,只包含一个JTextArea),一个通过大约40kb的BufferedInputStream加载本地文件的类,以及一个从一个类加载一个条目的类. Java属性文件.

一切都运行得很好,然而,我正在看Windows任务管理器,我注意到一些让我感到奇怪的东西.当我启动应用程序时,RAM使用量会在加载本地文件时跳转到大约40MB,并从中提取一些值以显示在JTextArea中,这对我来说是正常的,因为JVM,Java基类等等.但是,当应用程序完成加载文件时,它只是闲置,因为我目前还没有做任何其他事情.当它处于空闲状态时,只要窗口处于活动状态,应用程序的内存使用量就会每秒开始上升10-20kb.这让我很奇怪.如果我点击另一个程序使这个程序成为非活动窗口,内存仍会上升,但速度要慢得多(每3-5秒约10kb).

我没有测试看它会走多远,但这让我觉得非常奇怪.这是正常的Java行为吗?我想我的代码可能会泄漏内存,但我不确定如何.我确实关闭了我正在使用的BufferedInputStream,我看不出还有什么会导致这种情况.

如果我的解释没有意义,我很抱歉,但我很感激任何人可能有的见解和/或指示.

更新:

根据建议,我基本上将我的应用程序剥离到Main类,它只调用gui类.gui类只扩展JFrame并设置窗口大小,关闭操作和可见属性.随着这些变化,内存仍然以10-20kb的速度增长,但速度较慢.这与我收到的其他建议相结合,让我相信这只是Java.如果我发现其他任何有趣的东西,我将继续玩它,让大家都知道.

G__*_*G__ 9

尝试使用jconsole而不是Windows任务管理器监视堆使用情况:

  • 使用-Dcom.sun.management.jmxremote选项启动您的应用程序,例如

java -Dcom.sun.management.jmxremote -jar myapp.jar

  • jconsole从命令行启动,并连接到您在上一步中启动的java进程的本地pid.
  • 单击内存并查看堆内存(默认显示)

如果你观看一段时间,随着时间的推移,你可能会得到一个"锯齿"的模式,但是当垃圾收集器运行时它会急剧下降.您可以尝试通过单击如此标记的按钮来"建议"垃圾收集.

当你这样做时,内存使用量是否下降到相同的最低水平,或者是几分钟内总体最小值的增加?如果最小使用量增加,则会出现内存泄漏.如果它总是返回到相同的最低水平,那么你没事.

  • 请注意,JDK 6具有更加简单的实用程序:JVisualVM.通过在命令提示符下键入命令`jvisualvm`来启动它. (2认同)