Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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程序以60米或90米的速度运行是正常的吗?_Java_Memory_Memory Leaks_Out Of Memory - Fatal编程技术网

java程序以60米或90米的速度运行是正常的吗?

java程序以60米或90米的速度运行是正常的吗?,java,memory,memory-leaks,out-of-memory,Java,Memory,Memory Leaks,Out Of Memory,我有一个代理服务器程序,它监听套接字并创建一个线程池来处理连接,如果需要处理任何额外开销,这些连接会产生新线程。当我在java 1.5上启动程序时,它的内存占用是90M,而如果我使用java 1.6 jvm,它的内存占用是60M,对于一个简单的代理服务器程序来说,这似乎更大,这正常吗 我这样问是因为系统内存相当有限,有时会抛出OutOfMemoryException 以上统计数据是针对初始线程池大小小于10的情况。我将初始线程池大小增加到50,它在JVM1.5上的内存占用大约为120M 如何减少

我有一个代理服务器程序,它监听套接字并创建一个线程池来处理连接,如果需要处理任何额外开销,这些连接会产生新线程。当我在java 1.5上启动程序时,它的内存占用是90M,而如果我使用java 1.6 jvm,它的内存占用是60M,对于一个简单的代理服务器程序来说,这似乎更大,这正常吗

我这样问是因为系统内存相当有限,有时会抛出OutOfMemoryException

以上统计数据是针对初始线程池大小小于10的情况。我将初始线程池大小增加到50,它在JVM1.5上的内存占用大约为120M


如何减少内存使用?

您应该使用一种工具来帮助您分析程序的内存需求

例如,您可能需要查看
jvisualvm

您可以实时观看内存分配,也可以拍摄快照,并逐类分析内存消耗。

这听起来相当正常。如果内存占用非常关键,那么值得尝试不同的JVM,因为它们可能更高效或更臃肿。您可以尝试减少线程堆栈和TLAB分配大小,以减少每个线程的开销。

这是非常常见的大小。显而易见的答案——使用Java1.6,这样可以减少内存占用。要确定内存的去向,您需要进行分析。

这似乎适合小型Java进程—请记住,如果您正在寻找非常小的内存占用,Java并不是一个理想的选择

您应该记住,JVM是一个基于堆栈的机器,其中每个线程都有自己的堆栈

堆栈的大小取决于您运行的JVM类型(我相信,因为我已经丢失了oracle.com上详细说明这些值的页面),32位JVM以320kb堆栈运行每个线程,而64位JVM为每个线程分配1Mb—这解释了为什么拥有大线程池会增加内存大小

除了堆栈之外,JVM还为堆分配内存空间——堆栈空间通常不是从堆分配的,因此所有这些都会增加

如果超出内存限制,可以尝试在启动Java应用程序时使用命令行开关来限制使用

java -Xmx100m -Xss128k <followed by your other usual params>
java-Xmx100m-Xss128k
  • -Xmx
    用于限制最大堆大小(例如
    -Xmx100m
    将堆限制为100Mb
  • -Xss
    用于限制分配给每个线程的堆栈大小(例如
    -Xmx128k
    将每个堆栈限制为128Kb)
您还可以使用其他调优参数,但是在限制内存时应小心,因为可能会导致应用程序出现问题

垃圾收集是另一个可以进行调优的领域,以帮助提高内存使用率,但在这样一个小的应用程序上,我不会深入讨论这个领域

java -Xmx100m -Xss128k <followed by your other usual params>
正如Ingo所提到的,我建议您对应用程序使用探查器来查看内存分配的位置——许多流行的IDE要么内置探查器,要么作为插件提供