开发环境
操作系统:xp sp3 2002 (ps:客户公司环境只有这个老古董)
开发工具:myeclipse2014 32位
jdk: 1.7_49 32位
DB:DB2 9.1 32位
tomcat:1.7 32位
背景
由于环境比较老古董,需要跑比较大的项目,服务器启动就需要六七分钟...,不仅如此,过程还出现很多问题,今儿就把问题分享出来,
方便自己日后或者有哪位同志遇到也可以参考下
案例
问题1:Unable to process Jar entry [COM/ibm/db2os390/sqlj/custom/DB2SQLJCustomizer.class] from Jar ...
分析:意思是tomcat在启动时找不到db2所需的jar包,也许我的tomcat没有添加,所以就查看了%TOMCAT_HOME%confcatalina.properties文件,
定位到tomcat.util.scan.DefaultJarScanner.jarsToSkip...,按照原有的样式,添加一个db2jcc.jar就可以了,如下图
问题2:java.lang.OutOfMemoryError Java heap space的错误
分析:这个问题可能就比较普遍,网上也有很大文章解释这个的,我就不做详细解释了,大概就是这样的:
在JVM中如果98%的时间是用于GC且可用的 Heap size(堆内存) 不足2%的时候将抛出此异常信息。
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.
JVM在启动的时候会自动设置Heap size(堆内存)的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。
可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。
例如:java -jar -Xmn16m -Xms64m -Xmx128m MyApp.jar
如果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参数详解
-Xms | 初始堆大小。如:-Xms256m |
-Xmx | 最大堆大小。如:-Xmx512m |
-Xmn | 新生代大小。通常为 Xmx 的 1/3 或 1/4。新生代 = Eden + 2 个 Survivor 空间。实际可用空间为 = Eden + 1 个 Survivor,即 90% |
-Xss | JDK1.5+ 每个线程堆栈大小为 1M,一般来说如果栈不是很深的话, 1M 是绝对够用了的。 |
-XX:NewRatio | 新生代与老年代的比例,如 –XX:NewRatio=2,则新生代占整个堆空间的1/3,老年代占2/3 |
-XX:SurvivorRatio | 新生代中 Eden 与 Survivor 的比值。默认值为 8。即 Eden 占新生代空间的 8/10,另外两个 Survivor 各 占 1/10 |
-XX:PermSize | 永久代(方法区)的初始大小 |
-XX:MaxPermSize | 永久代(方法区)的最大值 |
-XX:+PrintGCDetails | 打印 GC 信息 |
XX:+HeapDumpOnOutOfMemoryError | 让虚拟机在发生内存溢出时 Dump 出当前的内存堆转储快照,以便分析用 |
我的系统内存是2G的,在MyEclipse中,一次打开windows --> preferences --> MyEclipse --> Servers --> tomcat --> tomcat 7.0 --> jdk
填入参数即可:
-Xms500m
-Xmx1024m
-XX:PermSize=64M
-XX:MaxPermSize=256m
-XX:ReservedCodeCacheSize=48m
-Duser.timezone=GMT+08
供参考,如图