我刚开始对java应用程序进行分析,当我看到我的小型应用程序可能占用整个操作系统的800MB内存和用户交互后的大约450MB时,我不确定。
所以我发表了一篇关于内存分配和gc如何工作的文章,似乎JVM可以获得所有可以获得的内容,而且大多数时候没有必要为应用程序运行那么多内存。
所以我测试了我可以限制堆多少而不会崩溃我的应用程序并停止在-Xmx32MB进行测试。
令我感到惊讶的是,除了应用程序使用的内存减少了近30倍之外,没有可识别的性能损失。
所以现在我想知道......
(1)......如果有任何限制堆的缩减?
(2)...如果堆的限制是常见的,或者是否可以让JVW决定它需要和想要使用多少内存?
(3)...找出应用程序运行所需的最小内存大小的最佳方法是什么? (我只是感兴趣)
(4)......在限制堆时我应该遇到性能损失吗?
提前谢谢!
答案 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
,当他们也可以使用字符串构建器时。