
2008年9月5日
一、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"
posted @
2009-03-02 14:19 星光 閱讀(221) |
評論 (0) |
編輯 收藏
對于windows,找到tomcat的bin目錄下面的catalina.bat,查找以下相似:
set _EXECJAVA=start "Tomcat" %_RUNJAVA%
把其中的Tomcat改成你想要的名字即可。
如:
set _EXECJAVA=start "MyWeb" %_RUNJAVA%
這樣在啟動Tomcat的時候窗口名字即是MyWeb。這樣在一個機器上啟動多個Tomcat的時候可以區分出來。
posted @
2008-09-12 10:42 星光 閱讀(360) |
評論 (0) |
編輯 收藏
最近在做項目時碰到關于java值傳遞和引用傳遞的問題,查不了少文章,做了幾個例子才搞明白,當然我總結出來的不一定是對的,歡迎大家來拍磚。主要有以下兩條:
1.如果是基本類型,那么傳遞進去的就是值傳遞。
2.如果不是基本類型,那么傳遞進去的就是對象引用的拷貝。
以下是例子:
public class Test {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Test1 {
private static Test staticTest;
public static void main(String[] args) {
Test t1 = new Test();
call(t1);
System.out.println(t1.getName());
}
public static void call(Test rt) {
staticTest = new Test();
staticTest.setName("abc");
rt.setName("cba");
rt = staticTest;
}
}
此時的運行結果是什么?機器給出的結果是“cba”,為什么會這樣,我理解如下:
rt.setName("cba");
此時rt是t1的一個復制,但是又不代表t1,但是rt和t1都指向同一個對象,無論通過rt還是t1來都會改變所引用對象的值。
rt = staticTest;
這時會把staticTest的引用賦給rt,但是rt只是t1的一個引用, rt此時指向staticTest,但是不會更改t1的值。
所以會發生以上的結果。不知道正確與否?
posted @
2008-09-05 14:48 星光 閱讀(247) |
評論 (2) |
編輯 收藏