java程序以60米或90米的速度运行是正常的吗?
我有一个代理服务器程序,它监听套接字并创建一个线程池来处理连接,如果需要处理任何额外开销,这些连接会产生新线程。当我在java 1.5上启动程序时,它的内存占用是90M,而如果我使用java 1.6 jvm,它的内存占用是60M,对于一个简单的代理服务器程序来说,这似乎更大,这正常吗 我这样问是因为系统内存相当有限,有时会抛出OutOfMemoryException 以上统计数据是针对初始线程池大小小于10的情况。我将初始线程池大小增加到50,它在JVM1.5上的内存占用大约为120Mjava程序以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 如何减少
如何减少内存使用?您应该使用一种工具来帮助您分析程序的内存需求 例如,您可能需要查看
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
将堆限制为100Mb-Xmx100m
用于限制分配给每个线程的堆栈大小(例如-Xss
将每个堆栈限制为128Kb)-Xmx128k
java -Xmx100m -Xss128k <followed by your other usual params>
正如Ingo所提到的,我建议您对应用程序使用探查器来查看内存分配的位置——许多流行的IDE要么内置探查器,要么作为插件提供