java 非堆 内存溢出_Tomcat非堆内存溢出

以下内容来源于网络,参考内容链接:

https://www.cnblogs.com/wulaijun/p/5490699.html

http://blog.51cto.com/lizhenliang/1763866

项目测试环境,开启Tomcat,运行一段时间之后,出现内存溢出情况,报错如下:

OutOfMemoryError: PermGen space   非堆溢出(永久保存区域溢出)

首先了解Tomcat的内存机制:

一.Tomcat运行环境介绍

1.Tomcat本身无法直接在计算机上运行,需要依赖硬件基础上的操作系统和java虚拟机;

2.java程序启动时JVM会分配一个初始内存和最大内存给这个应用;

3.当应用程序用到最大内存时,就会触发JVM做垃圾回收(GC)动作,释放被占用的内存;

4.因此想要调整java程序启动时的初始内存和最大内存,需要向JVM申请;

5.如果初始内存大小设置过小,且此时初始化的应用对象过多,虚拟机就必须重复的加载内存来满足使用;

6.基于以上原因,最好把初始内存(Xms)和最大内存(Xmx)设置成一样;

7.JVM上所有的对象都在“堆区(heap)”上分配内存(也有在栈上分配内存的)

8.堆的大小是可以动态扩展的,但“”堆“的大小受限于系统使用的物理内存,当应用程序需要的内存超出“堆”的最大值时,JVM虚拟机就会抛出内存溢出异常,并且导致应用程序崩溃;

9.基于以上原因,建议“堆”的大小设置成物理内存的80%;

二.JVM相关基础概念

1)JVM内存划分分为年轻代(young generation)、老年代(old generation)、永久代(permanent generation)

2)年轻代又分为Eden和survivor区,survivor区由fromspace和tospace组成,Eden区占大容量,survivor区两个区占小容量,默认比例为8:2

3)堆内存(heap)=年轻代+老年代。非堆内存=永久代

4)堆内存用处:存放的是对象,垃圾收集器就是收集这些对象,然后根据算法GC算法回收。

5)非堆内存用处:JVM本身使用,存放一些类、方法、常量、属性等。

6)年轻代:新生成的对象首先放到年轻代的Eden区中,当Eden满时,经过GC后,还存活的对象被复制到survivor区的fromspace中,如果survivor区满时,会再被复制到survivor区的tospace区,如果还有存活对象,就会被复制到老年代。

7)老年代:在年轻代中经过GC后还存活的对象会被复制到老年代中,当老年代空间不足时,JVM会对老年代进行完全的垃圾回收(full GC)。如果GC之后,还是无法存放从survivor区复制的对象,就会出现内存溢出OOM(out of memory)

8)永久代:也称为方法区,存放静态类型数据,比如类,方法,属性等。

根据控制台报错:java.lang.OutOfMemoryError: PermGen space ---- PermGen space(永久保存区内存溢出)

permgen space全称是permanent generation space,指内存的永久保留区域;

此内存溢出原因是这块内存主要被JVM存放class和meta信息,class在被load的时候被放入permgen space区域;permgen space区域与存放instance的heap区域不同,GC不会在主程序运行期间对permgen space进行清理;所以,如果APP会载入很多class的话,很可能会出现permgen space溢出。

解决方法:手动设置MaxPermSize大小。

总结来说:Tomcat在JVM上运行时,Tomcat可能加载了很多class,但是在运行期间GC不会回收此永久保存区内存,所以permgen space只会一直增大,直到达到指定的最大的XX:PermSize值,然后就出现了内存溢出情况,因为是测试环境,想要在测试时让应用稳定运行,将XX:MaxPermSize值设置稍微偏大,可以观察在两次开启Tomcat服务时间段之内大概会用到多少永久保存区的内存,然后进行设置,即可保障服务稳定运行。

在Tomcat家目录下的bin下有个catalina.bat配置文件,在其中设置内存:

JAVA_OPTS="-server -Xms512m -Xmx2048m -XX:PermSize=128m -XX:MaxNewSize=256m -XX:MaxPermSize=512m"

6361eb085aad407371a260e654598a3a.png

附(Tomcat自带状态页面):

bf362b0bc82683e43baf5759f2bfe95e.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值