Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何(不)处理高内存使用?_Java_Performance_Profiling_Heap - Fatal编程技术网

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

Java 如何(不)处理高内存使用?,java,performance,profiling,heap,Java,Performance,Profiling,Heap,我对评测java应用程序还不熟悉,当我看到我的小应用程序可能占用800MB的内存是整个操作系统的两倍,并且在一些用户交互后占用450MB左右时,我还不确定 因此,我已经阅读了一些关于内存分配和gc如何工作的文章,JVM似乎占用了它所能获得的一切,而且大多数情况下,运行应用程序不需要那么多内存 因此,我测试了在不破坏应用程序的情况下限制堆的能力,并在-Xmx32MB处停止了测试 令我惊讶的是,除了应用程序使用的内存减少了近30倍之外,还没有明显的性能损失 所以现在我想知道 (1) 。。。是否存

我对评测java应用程序还不熟悉,当我看到我的小应用程序可能占用800MB的内存是整个操作系统的两倍,并且在一些用户交互后占用450MB左右时,我还不确定

因此,我已经阅读了一些关于内存分配和gc如何工作的文章,JVM似乎占用了它所能获得的一切,而且大多数情况下,运行应用程序不需要那么多内存

因此,我测试了在不破坏应用程序的情况下限制堆的能力,并在-Xmx32MB处停止了测试

令我惊讶的是,除了应用程序使用的内存减少了近30倍之外,还没有明显的性能损失

所以现在我想知道

(1) 。。。是否存在限制堆的任何缩减站点

(2) 。。。如果限制堆是常见的,或者建议让JVW决定它需要和想要使用多少内存

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

(4) 。。。当限制堆时,我是否应该经历性能损失


提前谢谢你

非常简短地回答1和4:是的。对第2条的非常简短的回答是:没有

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

非常简单地回答1和4:是。对第2条的非常简短的回答是:没有

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

非常简单地回答1和4:是。对第2条的非常简短的回答是:没有

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

非常简单地回答1和4:是。对第2条的非常简短的回答是:没有

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

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

2) 通常设置内存大小以适合程序

3) 找出最佳大小的最佳方法是使用实际工作负载测试您的程序

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

1)是的,您的可用内存更少

2) 通常设置内存大小以适合程序

3) 找出最佳大小的最佳方法是使用实际工作负载测试您的程序

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

1)是的,您的可用内存更少

2) 通常设置内存大小以适合程序

3) 找出最佳大小的最佳方法是使用实际工作负载测试您的程序

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

1)是的,您的可用内存更少

2) 通常设置内存大小以适合程序

3) 找出最佳大小的最佳方法是使用实际工作负载测试您的程序


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

很可能您使用的
new
比您真正需要的多得多

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

有一种快速的方法可以找到答案。 取几个样品,如图所示。 如果你发现他们中有多人在做新的工作,那就是你的问题

人们经常做的是在一个循环中加入
new
,而他们也可以在循环外加入它


一个相关的问题是他们可能会做很多
string+string+string
,这会在下面做很多
new
-ing,而他们也可以使用字符串生成器。

很可能你使用的
new
比你真正需要的多得多

如果是这样的话,它也会影响