java内存性能 - 奇怪的行为(或者这是正常的吗?)

时间:2011-06-06 07:39:34

标签: java runtime heap memory-management

你好 我想首先说我是初学者,但我正在开发一个非常小而简单的Java应用程序,这真的不应该导致一些重大问题。 我正在监视来自Windows任务管理器的内存使用情况,并注意到我的应用程序启动后,java.exe使用了大约70MB的可用内存。所以我心想,好吧,这可能有点大,但是,我的电脑无法处理。但是当我试图调整窗口大小时,内存使用率突然跳到80-90 MB,如果我继续拖动窗口,随机调整大小,它会继续增加内存使用量。我认为这与在窗口调整大小期间调用GUI组件上的重绘方法有关,所以我采取了一些可能导致某种内存泄漏的可疑组件,并从我的主窗口表单中删除了那些,使我的程序几乎完全被剥离,但这个问题仍然存在。我后来注意到的是,如果我继续调整窗口大小,内存使用量会增加到200-220 MB,然后在那里停止这种不受控制的增长。 有人可以告诉我,这可能是一个正常的行为,考虑到java中的内存管理吗?

2 个答案:

答案 0 :(得分:4)

创建的Java对象一旦完成就不一定要清理。相反,称为“垃圾收集器”的东西会在后台定期运行,寻找孤立的对象并删除它们,从而释放内存。

您的应用程序可能会在调整窗口大小时创建大量临时对象。虽然不再被任何东西(即孤儿)引用,但这些对象一直闲着,直到垃圾收集器运行。

您可能会发现最大内存为256M(默认值) - 当您接近最大内存时,垃圾收集器可能会被更频繁地调用,而新对象的创建需要立即释放内存 - 因此由于需求平衡了创建/删除率,因此内存徘徊在256M以下。

这是完全正常的行为。

答案 1 :(得分:2)

不,这种行为完全正常。 Java内存管理基于自动垃圾收集,这意味着未使用的内存在被垃圾收集之前会累积一段时间(因为这是一项大量工作,您希望尽可能少地完成。

因此,JVM将倾向于使用允许使用的大部分内存(最大堆大小) - 并且在具有多GB可用内存的现代PC上,默认的最大堆大小将非常大。但是,如果您知道一个小应用程序不需要太多内存,则可以通过命令行选项-Xmx调整最大堆大小,例如

java -Xmx64M main.class.name

将堆限制为64MB