随笔-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 星光 阅读(217) | 评论 (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 星光 阅读(357) | 评论 (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 星光 阅读(243) | 评论 (2)编辑 收藏