隨筆-4  評論-2  文章-0  trackbacks-0
            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 星光 閱讀(222) | 評論 (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 星光 閱讀(361) | 評論 (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 星光 閱讀(249) | 評論 (2)編輯 收藏
          主站蜘蛛池模板: 卫辉市| 甘洛县| 神农架林区| 广西| 余姚市| 石屏县| 桑植县| 柳州市| 巩义市| 七台河市| 镇江市| 武强县| 包头市| 文昌市| 上栗县| 洛川县| 远安县| 岐山县| 乐清市| 阳山县| 沁源县| 利津县| 梁河县| 搜索| 沛县| 巴青县| 湟源县| 肃北| 西吉县| 香河县| 科技| 女性| 盐源县| 得荣县| 陆丰市| 惠安县| 靖安县| 绥芬河市| 合肥市| 牙克石市| 武城县|