如果要在 myeclipse 中启动, 上述的修改就不起作用了, 可如下设置:
Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK 面板中的
Optional Java VM arguments 中添加:-Xmx1024M -Xms512M -XX:MaxPermSize=256m
我使用的服务方式的 Tomcat, 内存 2G, 我在 Configure Tomcat-JAVA-JAVA OPTIONS 中的参数设置是:
- -Xms500m
- -Xmx1024m
- -XX:PermSize=64M
- -XX:MaxPermSize=256m
- -XX:ReservedCodeCacheSize=48m
- -Duser.timezone=GMT+08
- // 首先检查程序有没有限入死循环
这个问题主要还是由这个问题 java.lang.OutOfMemoryError: Java heap space 引起的. 第一次出现这样的的问题以后, 引发了其他的问题. 在网上一查可能是 JAVA 的堆栈设置太小的原因.
跟据网上的答案大致有这两种解决方法:
1, 设置环境变量
set JAVA_OPTS= -Xms32m -Xmx512m
可以根据自己机器的内存进行更改.
2,java -Xms32m -Xmx800m className
就是在执行 JAVA 类文件时加上这个参数, 其中 className 是需要执行的确类名.(包括包名)
这个解决问题了. 而且执行的速度比没有设置的时候快很多.
如果在测试的时候可能会用 Eclispe 这时候就需要在 Eclipse ->run -arguments 中的 VM arguments 中输入 - Xms32m -Xmx800m 这个参数就可以了.
后来在 Eclilpse 中修改了启动参数, 在 VM arguments 加入了 - Xms32m -Xmx800m, 问题解决.
一, java.lang.OutOfMemoryError: PermGen space
PermGen space 的全称是 Permanent Generation space, 是指内存的永久保存区域,
这块内存主要是被 JVM 存放 Class 和 Meta 信息的, Class 在被 Loader 时就会被放到 PermGen space 中,
它和存放类实例 (Instance) 的 Heap 区域不同, GC(Garbage Collection)不会在主程序运行期对
PermGen space 进行清理, 所以如果你的应用中有很多 CLASS 的话, 就很可能出现 PermGen space 错误,
这种错误常见在 web 服务器对 JSP 进行 pre compile 的时候. 如果你的 WEB APP 下都用了大量的第三方 jar, 其大小
超过了 jvm 默认的大小 (4M) 那么就会产生此错误信息了.
解决方法: 手动设置 MaxPermSize 大小
修改 TOMCAT_HOME/bin/catalina.sh
在 "echo"Using CATALINA_BASE: $CATALINA_BASE"" 上面加入以下行:
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
建议: 将相同的第三方 jar 文件移置到 tomcat/shared/lib 目录下, 这样可以达到减少 jar 文档重复占用内存的目的.
二, java.lang.OutOfMemoryError: Java heap space
Heap size 设置
JVM 堆的设置是指 java 程序运行过程中 JVM 可以调配使用的内存空间的设置. JVM 在启动的时候会自动设置 Heap size 的值,
其初始空间 (即 - Xms) 是物理内存的 1/64, 最大空间 (-Xmx) 是物理内存的 1/4. 可以利用 JVM 提供的 - Xmn -Xms -Xmx 等选项可
进行设置. Heap size 的大小是 Young Generation 和 Tenured Generaion 之和.
提示: 在 JVM 中如果 98%的时间是用于 GC 且可用的 Heap size 不足 2%的时候将抛出此异常信息.
提示: Heap Size 最大不要超过可用物理内存的 80%, 一般的要将 - Xms 和 - Xmx 选项设置为相同, 而 - Xmn 为 1/4 的 - Xmx 值.
解决方法: 手动设置 Heap size
修改 TOMCAT_HOME/bin/catalina.sh
在 "echo"Using CATALINA_BASE: $CATALINA_BASE"" 上面加入以下行:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
三, 实例, 以下给出 1G 内存环境下 java jvm 的参数设置参考:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true"
很大的 web 工程, 用 tomcat 默认分配的内存空间无法启动, 如果不是在 myeclipse 中启动 tomcat 可以对 tomcat 这样设置:
TOMCAT_HOME\bin\catalina.bat 中添加这样一句话:
set JAVA_OPTS= -Xmx1024M -Xms512M -XX:MaxPermSize=256m
Java 堆的管理 - 垃圾回收提到一下几点, 很不错, 或许可以作为写程序时候的准则:
(1)不要试图去假定垃圾收集发生的时间, 这一切都是未知的. 比如, 方法中的一个临时对象在方法调用完毕后就变成了无用对象, 这个时候它的内存就可以被释放.
(2)Java 中提供了一些和垃圾收集打交道的类, 而且提供了一种强行执行垃圾收集的方法 -- 调用 System.gc(), 但这同样是个不确定的方法. Java 中并不保证每次调用该方法就一定能够启动垃圾收集, 它只不过会向 JVM 发出这样一个申请, 到底是否真正执行垃圾收集, 一切都是个未知数.
(3)挑选适合自己的垃圾收集器. 一般来说, 如果系统没有特殊和苛刻的性能要求, 可以采用 JVM 的缺省选项. 否则可以考虑使用有针对性的垃圾收集器, 比如增量收集器就比较适合实时性要求较高的系统之中. 系统具有较高的配置, 有比较多的闲置资源, 可以考虑使用并行标记 / 清除收集器.
(4)关键的也是难把握的问题是内存泄漏. 良好的编程习惯和严谨的编程态度永远是最重要的, 不要让自己的一个小错误导致内存出现大漏洞.
(5)尽早释放无用对象的引用.
大多数程序员在使用临时变量的时候, 都是让引用变量在退出活动域 (scope) 后, 自动设置为 null, 暗示垃圾收集器来收集该对象, 还必须注意该引用的对象是否被监听, 如果有, 则要去掉监听器, 然后再赋空值.
就是说, 对于频繁申请内存和释放内存的操作, 还是自己控制一下比较好, 但是 System.gc()的方法不一定适用, 最好使用 finallize 强制执行或者写自己的 finallize 方法.
================================================
转载 java.lang.OutOfMemoryError: Java heap space 解决方法 收藏
java.lang.OutOfMemoryError: Java heap space 解决方法
这个问题的根源是 jvm 虚拟机的默认 Heap 大小是 64M, 可以通过设置其最大和最小值来实现. 设置的方法主要是几个.
1. 可以在 windows 更改系统环境变量
加上 JAVA_OPTS=-Xms64m -Xmx512m
2, 如果用的 tomcat, 在 windows 下, 可以在
C:\tomcat5.5.9\bin\catalina.bat 中加上:
set JAVA_OPTS=-Xms64m -Xmx256m
位置在: rem Guess CATALINA_HOME if not defined 这行的下面加合适.
3. 如果是 linux 系统
Linux 在{tomcat_home}/bin/catalina.sh 的前面, 加
set JAVA_OPTS='-Xms64 -Xmx512'
来源: http://www.bubuko.com/infodetail-2591802.html