java.lang.OutOfMemoryError: PermGen space PermGen spaceITeye - 超凡娱乐

java.lang.OutOfMemoryError: PermGen space PermGen spaceITeye

2019-01-10 15:55:24 | 作者: 向秋 | 标签: 内存,运用,设置 | 浏览: 2719

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决办法也一定是加大内存。
说说为什么会内存益出:这一部分用于寄存Class和Meta的信息,Class在被 Load的时分被放入PermGen space区域,它和和寄存Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运转期对PermGen space进行整理,所以假如你的APP会LOAD许多CLASS的话,就很或许呈现PermGen space过错。这种过错常见在web服务器对JSP进行pre compile的时分。
改正办法:-Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m

  在tomcat中redeploy时呈现outofmemory的过错. 能够有以下几个方面的原因:
1, 运用了proxool,因为proxool内部包含了一个老版别的cglib.
2, log4j,最好不必,只用common-logging
3, 老版别的cglib,快点更新到最新版。
4, 更新到最新的hibernate3.2 3、

这儿以tomcat环境为例,其它WEB服务器如jboss,weblogic等是同一个道理。

一、 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"


三、实例,以下给出1G内存环境下java jvm 的参数设置参阅:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "

内存缺乏 (OutOfMemory) - 因为java 堆或本地内存中的内存耗尽,运用程序显现“内存缺乏”过错。
内存走漏-java 堆或本地内存的继续内存增加,最终将导致内存缺乏状况。
调试内存走漏状况的技能与调试内存缺乏状况的技能相同。

Java 堆 - 这是 JVM 用来分配 java 目标的内存。
假如JVM不能在java堆中取得更多内存来分配更多java目标,将会抛出java内存缺乏(java.lang.OutOfMemoryError)过错。默许状况下,运用程序溃散。
本地内存 - 这是 JVM 用于其内部操作的内存。
假如 JVM 无法取得更多本地内存,它将抛出本地内存缺乏(本地 OutOfMemoryError)过错。当进程抵达操作系统的进程巨细限值,或许当计算机用完 RAM 和交流空间时,一般会发作这种状况。
进程巨细 - 进程巨细将是 java 堆、本地内存与加载的可履行文件和库所占用内存的总和。在 32 位操作系统上,进程的虚拟地址空间最大可抵达 4 GB。从这 4 GB 内存中,操作系统内核为自己保存一部分内存(一般为 1 - 2 GB)。剩下内存可用于运用程序。

2.
java虚拟机是遵循有关标准的一个软件完成,存在于内存中。jvm是由装置于机器上的jre(java运转环境)生成的。一般来说,每次运转一个application都会生成一个jvm,可是也能够有多个程序在同一个jvm里边。

能够运用指令java -X检查非标准(non-standard)的程序运转选项,以下3个是我所关怀的:

-Xms  set initial Java heap size
-Xmx  set maximum Java heap size
-Xss  set java thread stack size

-Xmx设置运用程序(不是jvm)能够运用的最大内存数,这个值也不应该设置过大,超越机器内存。
例如:java -Xmx50M testMemory
-Xms设置程序初始化的时分内存栈的巨细。有时能够用于改动程序运转的功率。
例如运用以下办法运转一个占用20M左右内存的程序testMemory:
  java -Xms50M testMemory

运用这个办法能够得到运用的空间运用量
/**//*
Returns the total amount of memory in the Java virtual machine. The value returned by this method may vary over time, depending on the host environment.
*/
System.out.println(Runtime.getRuntime().totalMemory());


3.
检查java进程的内存运用量:
Windows使命管理器(Windows Task Manager)

增大运转运用的Heap的取值

//指令行履行办法
java -Xms256 -Xmx512m app

//Tomcat履行办法
Windows下,在文件{tomcat_home}/bin/catalina.bat

在文件最初可增加如下设置:

set JAVA_OPTS=-Xms256m -Xmx512m

Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,可增加如下设置:

JAVA_OPTS=-Xms256m -Xmx512m
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表超凡娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    LINUX—rsync(跨渠道)ITeye

    文件,指定,效劳
  • 2

    Chubby翻译ITeye

    一个,效劳,客户端
  • 3

    ubuntu 增加 qqITeye

    运转,假如,装置
  • 4

    Mplayer有声响有图画ITeye

    声响,图画,可是
  • 5

    gcc新手入门ITeye

    文件,编译,程序
  • 6
  • 7

    浅谈https\ssl\数字证书(2)ITeye

    证书,数字证书,客户端
  • 8

    浅谈https\ssl\数字证书 1ITeye

    加密,证书,数字证书
  • 9
  • 10