如何(不)处理高内存使用?

时间:2015-09-03 20:09:25

标签: java performance profiling heap

我刚开始对java应用程序进行分析,当我看到我的小型应用程序可能占用整个操作系统的800MB内存和用户交互后的大约450MB时,我不确定。

heap without heap limitation

所以我发表了一篇关于内存分配和gc如何工作的文章,似乎JVM可以获得所有可以获得的内容,而且大多数时候没有必要为应用程序运行那么多内存。

所以我测试了我可以限制堆多少而不会崩溃我的应用程序并停止在-Xmx32MB进行测试。

heap limited to 32MB

令我感到惊讶的是,除了应用程序使用的内存减少了近30倍之外,没有可识别的性能损失。

所以现在我想知道......

(1)......如果有任何限制堆的缩减?

(2)...如果堆的限制是常见的,或者是否可以让JVW决定它需要和想要使用多少内存?

(3)...找出应用程序运行所需的最小内存大小的最佳方法是什么? (我只是感兴趣)

(4)......在限制堆时我应该遇到性能损失吗?

提前谢谢!

3 个答案:

答案 0 :(得分:1)

对1和4的简短回答:是的。非常简短的回答2:否。

您的垃圾收集器必须做更多不利于性能的工作。第三个问题很有趣。 你在嵌入或限制的东西中运行吗?它是一个庞大的多线程应用程序吗?您的应用程序是否需要超过可用的RAM? 如果对这些问题中的任何一个回答“是”,请运行探查器,而不是使用不同的内存分配,尝试查看代码在哪里占用你的内存?您是否正在使用可能使用本机数据类型的奇特对象(例如List)?例如byte [])?

答案 1 :(得分:1)

1)是的,你的可用内存较少,

2)通常将内存大小设置为适合程序。

3)找出最佳尺寸的最佳方法是用真实的工作负荷测试程序。

4)是的,有时是一点点,有时候很多。这取决于你在做什么。如果你需要节省内存,你可能会发现值得接受的性能损失。

答案 2 :(得分:1)

你有可能使用new比你真正需要的更多。

如果是这样,它也会影响您的效果,因为new并不便宜,即使您不计算gc

有一种快速的方法可以找到答案。 取几个样本,如this post。 如果你发现其中有几个人在做new,那就是你的问题。

人们经常做的事情是在一个循环中有new,当他们可以将它放在外面时。

一个相关的问题是他们可能会执行很多string + string + string,这会在下面执行很多new,当他们也可以使用字符串构建器时。