java.lang.OutOfMemoryError: Java heap space

 

java.lang.OutOfMemoryError: Java heap space

         at oracle.jdbc.driver.T4CDriverExtension.allocatePreparedStatement(T4CDriverExtension.java:68)

         at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3140)

         at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3042)

         at psdi.server.ConRef.prepareStatement(ConRef.java:364)

         at psdi.server.CronTaskManager.getLastTaskInfo(CronTaskManager.java:1199)

         at psdi.server.CronTaskManager$CronThread.run(CronTaskManager.java:2039)

 

解决方法:

上网查找说是要增大PermGen space的大小,但大部分都是修改tomcat的文章,最后找到http://darkjune.iteye.com/blog/178854才知道要在哪里修改。

方法:修改weblogic安装目录下wlserver\common\bin\commEnv.cmd,找到set MEM_ARGS=-Xms32m -Xmx200m -XX:MaxPermSize=128m,修改成set MEM_ARGS=-Xms256m -Xmx512m -XX:MaxPermSize=256m,可根据机器配置调整。其中有针对oracle自己jvmsun jvm的配置,我使用的是sumjvm所以只修改了“:sun”下面的MEM_ARGS。解释一下参数含义:

  -Xms:内存初始值
  -Xmx
:内存最大值(不要超过内存的80%

  -XX:MaxPermSize
PermGen(用于存放ClassMeta的信息)区域内存最大值。

运行一段时间发现还是报错,查看了启动命令,发现%MW_HOME%\user_projects\domains\mydomain\bin\setDomainEnv.cmd在调用完wlserver\common\bin\commEnv.cmd后有这么一句:set MEM_MAX_PERM_SIZE_32BIT=-XX:MaxPermSize=128m,将其修改成256m

 

- -

实际处理的时候考虑以下

1、是否为生成模式

2、是suN的jvm 还是ORACLE的jvm

3、考虑实际情况可以设置为set MEM_ARGS=-Xms512m -Xmx1024m -XX:MaxPermSize=256m

 

 

 

---



修改config文件

<server>
    <name>AdminServer</name>
    <execute-queue>
      <name>weblogic.kernel.Default</name>
      <thread-count>100</thread-count>
    </execute-queue>
        <use81-style-execute-queues>true</use81-style-execute-queues>
    <listen-address></listen-address>
  </server>

 

 

 

 

 

 

-- - - - - -

java.lang.OutOfMemoryError: Java heap space异常的解决:

此异常可能是JAVA的堆栈设置太小的原因,大致有以下几种解决方法:
1、设置环境变量
如果没有,则新建JAVA_OPTS变量,并set JAVA_OPTS= -Xms32m -Xmx512m
可以根据自己机器的内存进行更改。
2、java -Xms32m -Xmx800m className
就是在执行JAVA类文件时加上这个参数,其中className是要执行的明确类名,即包名+类名。
Eclipse的解决方案:

如果用Eclispe 这时候就需要在Eclipse ->run -arguments 中的VM arguments 中输入-Xms32m -Xmx800m这个参数。

    (1)、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 文档重复占用内存的目的。

(2)、java.lang.OutOfMemoryError: Java heap space
        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"

(3)、以下给出1G内存环境下java jvm 的参数设置参考:

JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "

很大的web工程,用tomcat默认分配的内存空间无法启动,如果不是在myeclipse中启动tomcat可以对tomcat这样设置:

TOMCAT_HOME\bin\catalina.bat 中添加这样一句话:    

set JAVA_OPTS= -Xmx1024M -Xms512M -XX:MaxPermSize=256m

注意:如果在myeclipse中启动tomcat,上述的修改就不起作用了,可如下设置:

Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK面板中的

Optional Java VM arguments中添加:-Xmx1024M -Xms512M -XX:MaxPermSize=256m

       Tomcat启动,内存2G,在Configure Tomcat-》JAVA-》JAVA OPTIONS中的参考参数设置是:
       -Xms500m
       -Xmx1024m
       -XX:PermSize=64M
       -XX:MaxPermSize=256m
       -XX:ReservedCodeCacheSize=48m
       -Duser.timezone=GMT+08

 

 

 

 

 

 

 

weblogic 10.3.3安装与配置    begin -- - - -

 

 [题记:前段时间,原Tomcat下的项目放到Weblogic下,服务老是很慢,有时甚至死掉,真的非常烦心,花费一下午的时间,搜索、调试,终于解决了“心病”............ ]

1、 打开软件,按照默认项进行安装。

2、开始-程序 weblogic- server --tools----configura  ,按默认项进安装

完成后,D:\bea\wlserver_10.3\common\bin下,

3、找到安装目录下的weblogic\common\bin\commEnv.cmd文件,打开修改如下代码:

:bea

if "%PROD TION_MODE%" == "tr" goto bea_prod_mode

set JAVA_VM=-jrockit

set MEM_ARGS=-Xms768m -Xmx1024m

set JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none

goto contin

:bea_prod_mode

set JAVA_VM=-jrockit

set MEM_ARGS=-Xms768m -Xmx1024m

goto contin

 

:sun

if "%PROD TION_MODE%" == "tr" goto sun_prod_mode

set JAVA_VM=-client

set MEM_ARGS=-Xms768m -Xmx1024m -XX:MaxPermSize=256m

set JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none

goto contin

:sun_prod_mode

set JAVA_VM=-server

set MEM_ARGS=-Xms768m -Xmx1024m -XX:MaxPermSize=256m

goto contin 

4、bea\user_projects\domains\XXX_domain\bin目录下的setDomainEnv.cmd文件,修改以下代码:

set MEM_ARGS=-Xms512m -Xmx1024m 

set MEM_PERM_SIZE=-XX:PermSize=128m 

set MEM_MAX_PERM_SIZE=-XX:MaxPermSize=256m 

注:3、4的作用是扩大内存访问机制,因为默认值太小了,以致服务器连接数多的情况下,weblogic老处于假死状态。 

5、修改D:\bea\user_projects\domains\base_domain\bin下startWebLogic文件加以下两行

set PRE_CLASSPATH=%WL_HOME%\server\lib\antlr-2.7.6.jar  

set CLASSPATH=%PRE_CLASSPATH%;%CLASSPATH% 

6、部署成功后,发现有些页面可以显示,而有些页面不能显示,打开后台发现一些list总报错,原因如下:

weblogic的jar与项目中的antlr-2.7.6冲突,将这个jar拷贝到D:\bea\wlserver_10.3\server\lib下,并且,删除D:\bea\wlserver_10.3\server\lib下

 

weblogic 10.3.3安装与配置    end-- - - -

 

 

JVM内存最大能调多大分析【经典】    begin  -- -- -

 

上次用weblogic 把 -XmxXXXX 设成2G,就启动不起来,设小点就起来了,当时很气,怎么2G都起不了,今天在看到了一篇解释,转过来了
这 次一位老友提出了这个问题,记得当年一个java高手在blogjava提出后,被骂得半死。大家使用java -XmxXXXX -version版本得出了不同的结论。后来老友说大概是1800M左右,我当时反驳,“我设置过服务器8G内存,我使用两个tomcat,每个2G”。 为此,我翻开所有的JVM的内存管理的c代码,没有任何结论。我不是linux内核程序员,但是我看过linux的源码,知道32位体系结构的计算机寻址 空间是2^32=4G,intel Pentium Pro处理器寻址空间是36位,CPU内部增加了PAE寄存器。用于处理多出来的4根地址
线 的使用,所以PAE的技术实现最大2^36=64G寻址。通过linux的内核源码,标准Linux内核对于物理内存的管理采用1:3的分配比例,即物理 内存的1/4为内核空间(kernel space),剩下的3/4为用户进程空间(user space),因此,在一台4G内存的服务器上,用户进程可使用的内存最大也就是3G。当进程被内核调入CPU运行时,不同的地址空间数据会被调入4G以 内的用户进程空间,其实就能用3G。 IA32架构上,单一进程是不能使用超过4G的内存空间的。但是我记得我给mysql server分配内存大约是1.7G左右,不是2的32次方-1,我分配java 2G内存的计算机是IBM的RS6000.
经过不同平台的测 试,我得出了大概的数值,win2k下1.6G左右,nt下1.2G,原因是这样的,Classic VM and HotSpot VM 存放用户区的连续地址中,NT把 kernel DLLs 放在 0x7c 开头的地址空间,所以nt下只有<2G的空间,所以JVM heap 使用极限是2G.用户的dll开始于0x77000000,用户的应用程序开始于0x00400000.我现在唯一确定的是sun可能为了防止和某些 JVM插件的冲突,把dll的地址给rebase一下,这样使用的空间就很少了一部分.为什末rebase,原因是这样的,因为在windows下编译 dll 的默认地址都是10000000, 一般在release之前的时候要rebase一下,rebase 的 -b 这个参数是指定一个起始地址,MSDN建议地址是0x60000000,这个工具随visual studio和platform SDK发放。
例 如
rebase.exe -b 0x6D000000 \jdk\jre\bin\*.dll \jdk\jre\bin\hotspot\jvm.dll这样你的JVM用的内存多一些,目前关于这个我只能得到BEA的 JRockit最大也只能使用1.8G内存,看来各家编译JDK时都作了些手脚.
目前只能得到bea的的-Xmx最小值是16 MB,sun的资料很不全,还好java开源了,可以不依靠sun了.

sun提供的资料
Maximum Address Space Per Process

Operating System Maximum Address Space Per Process

Redhat Linux 32 bit 2 GB

Redhat Linux 64 bit 3 GB

Windows 98/2000/NT/Me/XP 2 GB

Solaris x86 (32 bit) 4 GB

Solaris 32 bit 4 GB

Solaris 64 bit Terabytes
以 上文档有误,32位的redhat Server利用 Highmem技术可以使用3G内存.
solaris不愧是java的诞生平台。

问了一下bea的工程师,得出大致的结论,
Windows 2003/XP using the /3GB switch (32-bit OS)
1.85 GB - JRockit 5.0 R25.2 (SP2)
2.85 GB - JRockit 5.0 R26 (SP3)

Windows 2003/XP x64 Edition with a 32-bit JVM (64-bit OS)
2.05 GB - JRockit 5.0 R25.2 (SP2)
3.85 GB - JRockit 5.0 R26 (SP3)

对于windows 2000打开3G模式,windows核心编程说得很清楚,boot.ini加入/3G参数。

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(2)\WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WINNT="????" /3GB

Note: "????" in the previous example can be the programmatic name of any of the following operating system versions:

Windows XP Professional
Windows Server 2003
Windows Server 2003, Enterprise Edition
Windows Server 2003, Datacenter Edition
Windows 2000 Advanced Server
Windows 2000 Datacenter Server
Windows NT Server 4.0, Enterprise Edition

在我的机子测试一把,我的自己配置,1G内存,winXP

没有打开3G模式,sun的jdk 1.6 java -Xmx1447M -version,揪出错了,jrockit-R27.1.0-jdk1.5.0_08为1911M,3G模式 sun的jdk没有变化,IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 Windows XP x86-32 j9vmwi3223-2006050
4 (JIT enabled) 3G和2G相同,java -Xmx1787M -version 就出问题,jrockit-R27.1.0-jdk1.5.0_08为2899M,注意Xmx的内存不是物 理内存,我的机子物理内存只有1G
jrockit不愧为java第一虚拟机,只可惜不开源。




今天分析了当前比较流行的几个不同公司不同版本JVM的最大内存,得出来的结果如下:

公司 JVM版本 最大内存(兆)client 最大内存(兆)server
SUN 1.5.x 1492 1520
SUN 1.5.5(Linux) 2634 2660
SUN 1.4.2 1564 1564
SUN 1.4.2(Linux) 1900 1260
IBM 1.4.2(Linux) 2047 N/A
BEA JRockit 1.5 (U3) 1909 1902



除非特别说明,否则JVM版本都运行在Windows操作系统下

附:如何获得JVM的最大可用内存

在命令行下用 java -Xmx1200m -XX:MaxPermSize=60m -version 命令来进行测试,然后逐渐的增大XXXX的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息。
最后得到的虚拟机实际分配到的
总内存大小=堆内存+非堆内存
1200m:为堆内存大小,如果不指定后者参数则有最大数限制,网上很多文章认为这就是JVM内存,-Xmx为设置最大堆内存
60m:
为非堆内存大小,-XX:MaxPermSize实为永久域内存,在堆内存之外,属于非堆内存部分,jdk1.5我测了好像默认为62m,即得到非堆部分默认内存)

Sun HotSpot 1.4.1使用分代收集器,它把堆分为三个主要的域:新域、旧域以及永久域。Sun JVM生成的所有新对象放在新域中。一旦对象经历了一定数量的垃圾收集循环后,便获得使用期并进入旧域。在永久域中Sun JVM则存储class和method对象。就配置而言,永久域是一个独立域并且不认为是堆的一部分。

实际发现版本上有细微差别的JDK最大容许内存值都不尽相同,因此在实际的应用中还是要自己试验一下看到底内存能达到什么样的值。

通过这个表想说明的是,如果你的机器的内存太多的话,只能通过多运行几个实例来提供机器的利用率了,例如跑Tomcat,你可以多装几 个Tomcat并 做集群,依此类推。
-----------------------------------------------------------------------
32bit jvm和64bit jvm的WAS6.1内存配置问题

首先明确几点
1、32位也分不同的操作系统,他们支持的内存容量是不同的。
2、64位寻址地址是32位寻址地址的2倍
3、你的机器所拥有的可被分配内存有多大

一般来将,32位一般是每个节点不要超过1.5,可以设置为2G,但要看你机器有多大内存,拿XP来说,可管理内存为3G,那么你有2个节点,如果你每个设置为1.5,那么你的机器可能启动不了,因为你的系统其他应用也需要内存支持,这个时候,你就只能每个节点设置1,保证效率最大化。
64位上,虽然没有上限的限制,但是由于寻址地址的问题,所以一般设置为32位的2倍大小,也就是说应该在3~4之间,但是这么大的内存地址,会造成维护困难,所以一般要相应减少。
在碰到系统有大数据读取时,我们一般设置参数-Xloratio,这个参数是表明有多少内存是用于大数据读取的。使用如下-Xloratio0.1,证明有10%的内存用于大数据读取,平时是不占用这10%分配内存的。

32bit 的WAS 6.1不管装在64位机器还是32为机器上,每个profile的jvm的最大上限都是2G,但一般建议设置到
1G到1.5G 之间的值,就可以了

内存配置,看平均HeapSize的利用值,然后*(正负20%),即为最小与最大值的参考值。

如果存在内存泄露,多大的JVM一样是用完;如果没有内存泄露,1.5g足够使用;
6.1对 大对象的回收比 5.1要好很多;
-----------------------------------------------------------------------

≡≡≡ 网友评论 ≡≡≡
东子 网友说:
Windows下的最大内存应该跟NT内核对地址空间的保留也有关系, 好像默认情况下NT内核要占用高2G的地址空间, 所以应用程序撑死能获得的内存不会超过2G; 记得有一个参数可以让NT只占1G内存, 这样应用程序就有3G地址空间可用, 相应环境下JVM能允许的最大内存可能也会升高.

at 05-10-06 00:04
purpureleaf 网友说:
windows的每个应用(不是寻址)的寻址空间一般是2g或者3g,取决于一个参数。但是只要使用一组特定的函数分配内存,每个应用的寻址空间可以远远 超过4g

jdk可能是设置不了那个大的内存,但那不是windows造成的,是jdk造成的,在linux上一样设置不了。看来做java的朋友对windows 还是不熟

 

JVM内存最大能调多大分析【经典】    end-- -- -

 

 

 

Weblogic参数性能调优    begin - - -- -

http://blog.163.com/sunflower_87/blog/static/1754965072010112833349304/

 

 

1、虚拟机内存设置:

     set JAVA_OPTIONS=-Xms512m -Xmx512m
     set MEM_ARGS=-Xms512m -Xmx512m
     在设置上下限的时候最好将两者设为一致,以避免浪费频繁的申请和释放内存的开销。32位机器最大可启动1.8G内存的jvm,64位机器最大可启动3G内存的jvm;    
     jvm内存根据机器内存来设置。一般情况下:物理内存*80%*(25%~40%)

2、线程数量设置:
     服务器初始创建的执行线程的数量,设置原则:
     增大机器的最大并发线程数使处理器利用率达到最大。对于服务器端操作比较多的线程,应该减少线程计数;对于客户端操作比较多的,应该增加线程计数。并发线程数理论上等于“本地主机CPU个数+Stuck线程数”,够用即可,过大会降低系统性能。  
     将“线程计数”、“最大线程数”、“最小线程数”设置为相同的数值,“线程数增加”设为0,以减少线程数增减带来的性能消耗。

3、JDBC设置:
     最好的性能应该是连接数与当前客户会话(session)数相同。
     把连接池的大小设为与执行队列的线程数相等。默认下:开发模式为15,产品模式为25。

4、测试保留的连接(FALSE):
     TestConnectionsOnReserve设置为false(缺省设置)。如果此参数设置为真(true),则在连接被分配给调用者之前,都要经过测试,这会额外要求与数据库的反复连接。

5、多池算法类型:
     如果将Algorithm Type设置为“High availability”,那么在使用另一个池中的连接之前,一个池中的所有可用连接应已经用完。如果将Algorithm Type设置为“Load balancing”,多池会将连接请求平均地分布给多池中的所有连接池。

 

Weblogic参数性能调优    end- - -- -

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值