报错现象
Java 程序出现异常 java.lang.OutOfMemoryError: Java heap space
报错原因
在 JVM 中如果 98% 的时间是用于 GC 且可用的 Heap Size 不足 2% 的时候将抛出此异常信息。
Heap Size 默认配置
JVM 堆的设置是指 Java 程序运行过程中 JVM 可以调配使用的内存空间的设置,JVM在启动的时候会自动设置Heap Size的值。
-Xms 堆内存的最小大小,默认为物理内存的1/64
-Xmx 堆内存的最大大小,默认为物理内存的1/4
-Xmn 堆内新生代的大小,通过这个值也可以得到老生代的大小:-Xmx减-Xmn
Heap Size 设置注意
Heap Size 设置偏小,除了这些异常信息外,还会发现程序的响应速度变慢了,GC 占用了更多的时间,而应用分配到的执行时间较少。
Heap Size 最大不要超过可用物理内存的80%,一般的要将 -Xms 和 -Xmx 选项设置为相同,而 -Xmn 为1/4的 -Xmx 值。
Heap Size 的 -Xms -Xmn 设置不要超出物理内存的大小,否则会提示“Error occurred during initialization of VM Could not reserve enough space for object heap”。
解决方法
这个问题的根源是 JVM 虚拟机的默认 Heap 大小是64M,可以通过设置其最大和最小值来实现
方法1: 如果使用jar包
java -jar -Xms64m -Xmx128m MyApp.jar
方法2:如果使用tomcat
Windows下,加在 ..\tomcat\bin\catalina.bat 文件中
rem Guess CATALINA_HOME if not defined
set JAVA_OPTS=-Xms64m -Xmx256m #加在这里
Linux系统,加在 ../tomcat/bin/catalina.sh 文件中
# LOGGING_MANAGER (Optional) Override Tomcat's logging manager
# Example (all one line)
# LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
# -----------------------------------------------------------------------------
set JAVA_OPTS='-Xms64 -Xmx512' #加在这里
# OS specific support. $var _must_ be set to either true or false.
网友评论