int len = Integer.parseInt(String.valueOf(this.getFileLength()));//end - begin
System.out.println("int Len:"+len);
// 保存每个线程读取的数据
byte b[] = new byte[len];
System.out.println("b="+b);当执行到byte b[] = new byte[len];时抛出java.lang.reflect.InvocationTargetException
导致内存溢出java.lang.OutOfMemoryError: Java heap space
而int Len已打印出来为54095475是一个51.5M文件,小于50M就可以.
大于50M就出此问题!请问,这是为什么?有什么解决办法吗?急......

解决方案 »

  1.   

    首先是:java.lang.OutOfMemoryError: Java heap space
    (java.lang.reflect.InvocationTargetException 也是汤姆猫的错误)Heap size 设置在jvm的堆中,设置了java程序运行可需要的内存空间,
    这个是自动设置的内存的空间起初是物理内存的1/64,
    最大是1/4,可利用jvm提供的-xmn -xms等选项设置
    Heap size  大小事Yuong Generartion 和 Tenured Generation
    之和
    手动设置Heap size
    修改TOMCAT_HOME/bin/catalina.bat,在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
    set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m或修改catalina.sh
    在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
    JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m"看看可不可行..
      

  2.   

    我这个tomcat没有catalina.bat,请问那怎么办呀...?
      

  3.   

    呵呵,暂时弄不到!写就写不出来了!
    可以改myeclisep根目录下面的myeclipse.ini文件吗???
      

  4.   

    你的tomcat怎么启动的?找到启动的脚本
    找到java执行的地方,比如
    java xxx
    修改为
    java -Xms1024M xxx
      

  5.   

    我这个tomcat是安装的,不是绿色版的!
    tomcat\bin\下就五个文件
    1:bootstrap.jar
    2:tomcat6.exe
    3:tomcat6w.exe
    4:tomcat-juli.jar
    5:service.bat
      

  6.   

    在MyEclipse选择你的程序文件,右击选择Run As->RUN CONFIGURATIONS->Arguments选项框->VM arguments 
    加入-Xms256m -Xmx512m 
      

  7.   

    这个是不是只能在有main()的类文件里面呀?
      

  8.   

    tomcat 一般都不用日食自带的
    多数都是下载单独的tomcat 
      

  9.   

    嗯,以上的方法都试了,由于没有catalina.bat,所以这个就没有试!
    问题还是没有解决。只有这种办法吗???
      

  10.   

    别的办法也有- -换个更大的物理内存条..你选择那个方式??是换内存 还是再找找tomcat?~~
      

  11.   

    不过 如果不是一定要byte数组的话 用列表 或者其他方式储存
    应该能够勉强可行把
      

  12.   

    不是吧 报什么错误呢 你该一下TOMCAT的内存试试
      

  13.   

    手动设置Heap size
    修改TOMCAT_HOME/bin/catalina.bat,在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
    set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m
      

  14.   

    不行就换个思路 估计是你读的时候this.getFileLength()这个方法有问题哦
    是不是文件流什么的没有关闭撒
      

  15.   

    不是的,System.out.println("int Len:"+len);
    这里已经打印出来了!
    主要是我tomcat\bin目录下没有catalina.bat文件。
      

  16.   

    嗯,但是我没有catalina.bat文件也无法试呀!
    别说找同事了,就两个搞Java的,都是装的一样的tomcat
      

  17.   

    安装版的,应该也有配置的地方的,查了一下资料,看看能否修改server.xml配置文件
    找到配置文件中"%EXECUTABLE%" //US//%SERVICE_NAME% --JvmOptions的地方,修改一下JVM参数,如
    "%EXECUTABLE%" //US//%SERVICE_NAME% --JvmOptions "-Xms1024M xxx(缺省的保持不变)" --StartMode jvm --StopMode jvm 
      

  18.   

    兄弟,确认是server.xml配置文件吗?
    我在tomcat/bin/conf/server.xml根本没有找到这些东西呀?
      

  19.   

    哦,目录写错了。是tomcat/conf/server.xml根本没有找到这些东西
      

  20.   

    是在catalina.sh中
    有1个java_opts的参数
    你的绿色版的tomcat不能换一个不是绿色的啊 
    这个不是问题
      

  21.   

    我是在windows平台下,不是linux平台下!
    linux平台是catalina.sh文件。我的tomcat是安装版的在conf目录下只有五个文件
    1:bootstrap.jar
    2:tomcat6.exe
    3:tomcat6w.exe
    4:tomcat-juli.jar
    5:service.bat
    换一个绿色版的,自己当然可以随时换,但是服务器呢?
    这意味着服务器上也要跟着换,所有这个方法不可取!
      

  22.   

    而且,tc绿色版可以用 service install命令安装为windows服务
    不推荐使用安装版,安装版毛病很多
      

  23.   


    对,是的!但是我这个多线程下载不是在PC上有,而是手机上面!
    我这个是后台,前台用的是C/C++调用后台方法,我要把数据传过去!
    如果说用临时文件,同一时间有很多人下载同一个文件,
    那么服务器上的临时文件相当的多,但是下载完就删了,但是没有下载完呢?
    全部在服务器上,所以,这种方法不可取!
    最后就采用byte[]保存所有线程下载的数据,最后一次性写入到输出流中......
      

  24.   

    服务器上的工程,每时每刻都在跑!
    在说了,服务器上的tomcat换绿色版!
    那也不是我说换就可以换的呀,呵呵...
      

  25.   

    试试看,在dos的cmd下执行
    set CATALINA_OPTS=-Xms1024m
    tomcat6.exe
    这样的方式启动服务或者直接带参数启动
    tomcat6.exe //US//Tomcat6 --JvmMs=1024 --JvmMx=1024没用过安装版的,不知道有没有 tomcat6.exe -help 之类的,查看一下帮助
      

  26.   

    刚在网上找了,通过:window->preferences->MyEclipse....->Servers->Tomcat->Tomcat 6.X->JDK->Optional Java VM arguments->-Xms128m 
    -Xmx256m-Dcom.sun.management.jmxremote=true这样就可以了,对于你的方法我来试下!
      

  27.   

    直接在运行里这样写吗:
    D:\tools\Tomcat 6.0\bin\tomcat6.exe //US//Tomcat6 --JvmMs=1024 --JvmMx=1024
    这样子不行,windows找不到文件!
    不要后面的是可以启动,当然这样照样java.lang.OutOfMemoryError: Java heap space
     
    //Tomcat6 :这个到底是指的什么...???
      

  28.   

    //Tomcat6 :这个到底是指的什么...???
    指的是tomcate服务
      

  29.   

    嗯,我刚看了!我的tomcat服务名称是Tomcat6
    那么:D:\tools\Tomcat 6.0\bin\tomcat6.exe //US//Tomcat6 --JvmMs=1024 --JvmMx=1024
    这样应该可以呀!但是提示:windows找不到文件!
    那么怎样改...?
      

  30.   

    我这边没环境所以没法查看
    你自己看下官方网的说明吧
    http://tomcat.apache.org/tomcat-6.0-doc/windows-service-howto.html
      

  31.   

    tomcat的虚拟内存改大一点就行拉
      

  32.   

    嗯,我是在myeclipse里设置的!那么这两种有区别吗?
    myeclipse设置的步骤是:window->preferences->MyEclipse....->Servers->Tomcat->Tomcat 6.X->JDK->Optional Java VM arguments->-Xms128m 
    -Xmx256m-Dcom.sun.management.jmxremote=true
      

  33.   

    从tomcat的启动结果来说应该没什么区别吧
    这样的话每次都要通过MyEclipse来启动server,如果是直接用命令的方式就不需要myeclipse,你可以查看一下,myeclipse是怎么集成tomcat的,有什么启动脚本一类的,看看能不能找到一些线索
      

  34.   

    哦,明白了!你的意思是:像我这样,必须通过MyEclipse来启动Tomcat那么才会有效,否则直接启动tomcat将无效!兄弟,讨论另一问题吧:我这个是做的多线程下载,没有用临时文件。由于IE是单线程的,所以我的做法是:先把每个线程读取的数所存放在byte[]里面,在每个线程下载完后将byte[]写入输了流!这样现在才发现,占用的内存比较大,当我下载时CPU达到90%以上。还有别的什么方法吗?用集合也一样!
      

  35.   

    byte只是做一个缓冲区的,要是我有个2G的文件你开10个线程去内存立马爆掉byte[] temp = new byte[1024*1024];//内存分配1M缓冲区
    int len = -1;
    while((len=inputstream.read(temp))!=-1){
       outputstram.write(temp,0,len);
    }
      

  36.   


    安装版的一样的可以设置。
    你打开3:tomcat6w.exe,找到Java选项卡,找到Miximum memory pool,在里面设置,如果没有那可能是Optional Java VM arguments里面,反正可以设置环境的地方。
    你看看。
      

  37.   

    3:tomcat6w.exe
    这个文件中,可以设置内存,中间那个填上1024就ok了
      

  38.   

    呵呵,内存溢出了呀!仔细检查代码什么地方占内存了或调Java虚拟内存!