Tomcat内存溢出分析及解决方法

更新时间:2012年11月21日 15:41:43   作者:

堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的,本文将详细介绍Tomcat内存溢出,需要了解更多的朋友可以参考下

JVM管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。

一、内存溢出类型

1、java.lang.OutOfMemoryError: PermGen space

JVM管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。

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)那么就会产生此错误信息了。

一个最佳的配置例子:(经过本人验证,自从用此配置之后,再未出现过tomcat死掉的情况)

set JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m

在linux下 在tomcathome/conf/catalina.sh中加上如标红所示的一句代码:可以增加tomcat jvm 的内存,这样就不容易出现内存溢出的现象了!

# ----- Execute The Requested Command -----------------------------------------

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

# Bugzilla 37848: only output this if we have a TTY

2、java.lang.OutOfMemoryError: Javaheap space

第一种情况是个补充,主要存在问题就是出现在这个情况中。其默认空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。如果内存剩余不到40%,JVM就会增大堆到Xmx设置的值,内存剩余超过70%,JVM就会减小堆到Xms设置的值。所以服务器的Xmx和Xms设置一般应该设置相同避免每次GC后都要调整虚拟机堆的大小。假设物理内存无限大,那么JVM内存的最大值跟操作系统有关,一般32位机是1.5g到3g之间,而64位的就不会有限制了。

注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。

垃圾回收GC的角色

JVM调用GC的频度还是很高的,主要两种情况下进行垃圾回收:

当应用程序线程空闲;另一个是java内存堆不足时,会不断调用GC,若连续回收都解决不了内存堆不足的问题时,就会报out of memory错误。因为这个异常根据系统运行环境决定,所以无法预期它何时出现。

根据GC的机制,程序的运行会引起系统运行环境的变化,增加GC的触发机会。

为了避免这些问题,程序的设计和编写就应避免垃圾对象的内存占用和GC的开销。显示调用System.GC()只能建议JVM需要在内存中对垃圾对象进行回收,但不是必须马上回收,

一个是并不能解决内存资源耗空的局面,另外也会增加GC的消耗。

二、JVM内存区域组成

简单的说java中的堆和栈

java把内存分两种:一种是栈内存,另一种是堆内存

1、在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配;

2、堆内存用来存放由new创建的对象和数组

在函数(代码块)中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的内存空间;在堆中分配的内存由java虚拟机的自动垃圾回收器来管理

堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。缺点就是要在运行时动态分配内存,存取速度较慢;

栈的优势是存取速度比堆要快,缺点是存在栈中的数据大小与生存期必须是确定的无灵活性。

java堆分为三个区:New、Old和Permanent

GC有两个线程:

新创建的对象被分配到New区,当该区被填满时会被GC辅助线程移到Old区,当Old区也填满了会触发GC主线程遍历堆内存里的所有对象。Old区的大小等于Xmx减去-Xmn

java栈存放

栈调整:参数有+UseDefaultStackSize -Xss256K,表示每个线程可申请256k的栈空间

每个线程都有他自己的Stack

三、JVM如何设置虚拟内存

提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。

提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。

提示:JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。

默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。

提示:假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。

简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,

这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了

注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。

提示:设置NewSize、MaxNewSize相等,"new"的大小最好不要大于"old"的一半,原因是old区如果不够大会频繁的触发"主" GC ,大大降低了性能

JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;

由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。

解决方法:手动设置Heap size

修改TOMCAT_HOME/bin/catalina.bat

在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:

JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"

四、性能检查工具使用

定位内存泄漏:

JProfiler工具主要用于检查和跟踪系统(限于Java开发的)的性能。JProfiler可以通过时时的监控系统的内存使用情况,随时监视垃圾回收,线程运行状况等手段,从而很好的监视JVM运行情况及其性能。

1. 应用服务器内存长期不合理占用,内存经常处于高位占用,很难回收到低位。

相关文章

今天小编就为大家分享一篇关于Java中流的有关知识点详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2019-01-01

这篇文章主要为大家详细介绍了DecimalFormat数字格式化用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2018-03-03

ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。下面我们来深入了解一下它吧2019-06-06

Maven是围绕着构建生命周期的核心概念为原型,整个项目的创建和部署都是围绕着生命周期展开的,一个生命周期由若干个生命周期阶段组成。下面通过本文给大家介绍Maven 配置文件 生命周期 常用命令详解,一起看看吧2017-11-11

这篇文章主要介绍了mybatis insert返回主键代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2019-12-12

这篇文章主要介绍了java微信公众号开发,主要内容有测试公众号与本地测试环境搭建,需要的朋友可以参考下2015-12-12

这篇文章主要介绍了Java编程中JDialog窗体的用法及实例,描述了其特征,具有一定参考价值,需要的朋友可以了解下。2017-09-09

这篇文章主要介绍了java按指定编码写入和读取文件内容的类,需要的朋友可以参考下2014-02-02

这篇文章主要介绍了springboot整合mybatis中的问题及出现的一些问题小结,本文给出了解决方案,需要的朋友可以参考下2018-11-11

这篇文章主要给大家介绍了关于Spring AOP如何整合redis(注解方式)实现缓存统一管理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧2018-08-08

最新评论

java tomcat 内存溢出怎么解决_Tomcat内存溢出分析及解决方法相关推荐

  1. Java中 9 种常见的 CMS GC 问题分析与解决

    目录 Java中 9 种常见的 CMS GC 问题分析与解决 1. GC 1.1 引言 1.2 概览 2. GC 基础 2.1 基础概念 2.2 JVM 内存划分 2.3 分配对象 2.4 收集对象 ...

  2. tomcat服务器cpu占用率居高不下的原因分析及解决

    tomcat服务器cpu占用率居高不下的原因分析及解决 偶遇服务器cpu飙升,过段时间后正常,反反复复 获取cpu占用高的java进程运行中的堆栈信息 偶遇服务器cpu飙升,过段时间后正常,反反复复 ...

  3. Java遍历List和Map出现ConcurrentModificationException异常原因分析及解决方法

    Java遍历 List 和 Map 出现 ConcurrentModificationException 异常原因分析及解决方法 一.单线程 异常情况举例 只要抛出出现异常,可以肯定的是代码一定有错误 ...

  4. 美团技术总结:Java中9种常见的CMS GC问题分析与解决

    1. 写在前面 | 本文主要针对 Hotspot VM 中"CMS + ParNew"组合的一些使用场景进行总结.重点通过部分源码对根因进行分析以及对排查方法进行总结,排查过程会省 ...

  5. 美团技术:Java中9种常见的CMS GC问题分析与解决

    目前,互联网上 Java 的 GC 资料要么是主要讲解理论,要么就是针对单一场景的 GC 问题进行了剖析,对整个体系总结的资料少之又少.前车之鉴,后事之师,美团的几位工程师历时一年多的时间,搜集了内部 ...

  6. java gc日志乱码_Java中9种常见的CMS GC问题分析与解决(四)

    目前,互联网上 Java 的 GC 资料要么是主要讲解理论,要么就是针对单一场景的 GC 问题进行了剖析,对整个体系总结的资料少之又少.前车之鉴,后事之师,美团的几位工程师历时一年多的时间,搜集了内部 ...

  7. 计算机培训工作坊主题研讨,问题分析与解决工作坊培训

    课程大纲 第一讲:问题分析与解决之前--心智动力建设 一.团队打造的4C理论--打开心的工具 1. 真相猜猜猜 引导技术:团队链接与打开 2. 对话岛 引导技术:行动学习对话岛,角色表演,坦露心声 二 ...

  8. java栈堆溢出怎么解决_java内存溢出示例(堆溢出、栈溢出)

    堆溢出:/** * @author LXA * 堆溢出 */ public class Heap { public static void main(String[] args) { ArrayLis ...

  9. jvm解决堆内存溢出问题

    我们讲一下堆溢出,栈溢出,还有方法区的溢出,这就讲了一个概念,内存溢出和内存泄露的区别是什么,这个概念很混淆,内存泄露怎么又包含内存溢出,内存溢出和内存泄露又有区别,待会我会细讲的,堆溢出我们怎么去解 ...

  10. Java内存模型和常见的内存溢出类型及解决方案

    Java内存模型与常见的内存溢出 一. Java 运行过程和内存分配 1 Java的平台无关性 2 Java内存模型 2.1Java内存模型图 3 内存结构详解 3.1 元空间(MetaSpace) ...

最新文章

  1. 【SICP练习】110 练习3.23
  2. three.js 背景图片
  3. 添加删除一个controller
  4. C# 离线人脸识别 ArcSoft
  5. “开源、共享、创新”, 中国最具前景开发者峰会落幕魔都
  6. 用Java代码在ElasticSearch中索引PDF文件?
  7. squid3.0缓存服务器编译安装
  8. 报错, liquibase.exception.ValidationFailedException: Validation Failed
  9. Android Animation学习(一) Property Animation原理介绍和API简介
  10. C4D立体数字设计灵感,适合庆典应用|这波用得6啊!
  11. Unity 全面理解加载和内存管理
  12. 判断new出来的对象里面值为null
  13. 敏捷开发“松结对编程”系列之七:问题集之一
  14. Chrome中使用showModalDialog无法接收返回值,解决方案
  15. “ +”(加号)CSS选择器是什么意思?
  16. Rockchip Android12 Codec2 插件 多线程实现代码
  17. ubuntu18.04自带的输入法数字键选择出现数字而不是中文
  18. Word 2003 长篇文档排版技巧(二)
  19. 网络篇 思科设备的登陆方式07
  20. 知识图谱系统课程笔记(二)——知识抽取与挖掘

热门文章

  1. vi编辑文件时如何批量替换字符串
  2. android nv21 nv12,android - 将NV21转换为NV12并旋转90度通过libyuv? - 堆栈内存溢出
  3. 工资软件测试白盒测试报告,白盒测试测试报告模板.doc
  4. 爱希ISee人体感应器,雷达人体存在探测应用,毫米波雷达技术方案
  5. OSPF基础知识及配置命令
  6. 计算机基础知识精品课程,计算机应用基础精品课程课件第1课计算机基础知识第课计算机基础.PDF...
  7. 【Altium Designer】:关于原理图绘制的基本学习
  8. 《手把手教你学DSP》总结1
  9. Android Content Providers(二)——Contacts Provider
  10. InstallShield 模块详解