gpt4 book ai didi

Java 应用程序内存使用情况

转载 作者:IT王子 更新时间:2023-10-28 23:37:03 26 4
gpt4 key购买 nike

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

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

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

如果我的解释没有意义,我很抱歉,但我希望任何人有任何见解和/或指点。

更新:

根据建议,我基本上将我的应用程序剥离到 Main 类,它只是调用 gui 类。 gui 类仅扩展 JFrame 并设置窗口大小、关闭操作和可见属性。通过这些更改,内存仍以 10-20kb 的速度增长,但速度较慢。这与我收到的其他建议一起使我相信这只是 Java。我会继续玩它,如果我发现其他有趣的东西,我会告诉大家。

最佳答案

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

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

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

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

如果您观察一段时间,您可能会在内存随时间攀升时出现“锯齿”模式,但随后在垃圾收集器运行时会急剧下降。您可以尝试通过单击这样标记的按钮来“建议”垃圾收集。

当您执行此操作时,内存使用量是否会下降到相同的最低水平,或者整个最低限度是否会在几分钟内增加?如果最小使用量增加,那么您就有内存泄漏。如果它总是返回到相同的最低水平,那么你很好。

关于Java 应用程序内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3145989/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com