`
Josh_Persistence
  • 浏览: 1650119 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

从JVM的常见异常来看Tomcat中内存的设置

阅读更多

一、Tomcat和JDK的关系:

       1. Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java 虚拟机。

        2. JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序。这个初始内存和最大内存在一定程度都会影响程序的性能。比如说在应用程序用到最大内存的时候,JVM是要先去做垃圾回收的动作,释放被占用的一些内存。所以想调整Tomcat的启动时初始内存和最大内存就需要向JVM声明, 一般的JAVA程序在运行都可以通过-Xms -Xmx来调整应用程序的初始内存和最大内存:  这两个值的大小一般根据需要进行设置。

        3.为什么一般把-Xms和-Xmx设置成一样大?

初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用程序在大负 载的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化,虚拟机就必须重复地增加内存来满足使用。由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应 、用程序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。

        Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,会造成内存溢出的异常。

 

二、常见的Java内存溢出有以下三种:

 

         1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出
JVM在启动的时候会自动设置JVM Heap的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)不可超过物理内存。

 

堆内存可以利用JVM提供的-Xmn -Xms -Xmx等选项进行设置。Heap的大小是Young Generation 和Tenured Generaion 之和。

 

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

 

解决方法:手动设置JVM Heap(堆)的大小。  

 

 

 

          2. java.lang.OutOfMemoryError: PermGen space  ---- PermGen space溢出。
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。

 

为什么会内存溢出,这是由于这块内存主要是被JVM存放Class和Meta信息的,Class在被Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同。sun的GC不会在主程序运行期对PermGen space进行清理,所以如果你的APP会载入很多CLASS的话,就很可能出现PermGen space溢出。

 

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

 

 

 

          3. java.lang.StackOverflowError   ---- 栈溢出
JVM依然是采用栈式的虚拟机,这个和C和Pascal都是一样的。函数的调用过程都体现在堆栈和退栈上了。
调用构造函数的 “层”太多了,以致于把栈区溢出了。
通常来讲,一般栈区远远小于堆区的,因为函数调用过程往往不会多于上千层,而即便每个函数调用需要 1K的空间(这个大约相当于在一个C函数内声明了256个int类型的变量),那么栈区也不过是需要1MB的空间。通常栈的大小是1-2MB的。通常递归即使递归的层次不会过多,也很容易溢出。

 

解决方法:修改程序。

 

三、怎样修改Tomcat的初始化内存

         有如下修改方法:

        1、Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增加如下设置:

Windows下:

set JAVA_OPTS=-server -Xms2048m -Xmx2048m -Xss512k -XX:PermSize=512M -XX:MaxNewSize=512m -XX:MaxPermSize=780m

 

Linux下:注意没有set,但是有引号

 

JAVA_OPTS="-Xms256m -Xmx512m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m"

 

参数说明:

         -server:一定要作为第一个参数,在多个CPU时性能佳

 

  JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'

 

  需要把这个两个参数值调大。例如:

 

  JAVA_OPTS='-Xms256m -Xmx512m'

 

  表示初始化内存为256MB,可以使用的最大内存为512MB。

住,必须要有m(表示兆,如果没有,则是KB)

 

        2.  环境变量中设变量名:JAVA_OPTS     变量值:-Xms512m   -Xmx512m

 

 

        3.   前两种方法针对的是bin目录下有catalina.bat的情况(比如 直接解压的Tomcat等),但是有些安装版的Tomcat下没有catalina.bat,这个时候可以采用如下方法,当然这个方法也是最通用的方法: 打开tomcatHome//bin//tomcat7w.exe,点击Java选项卡,然后将会发现其中有这么两项:Initial memory pool和Maximum memory pool。

       其中Initial memory pool这个就是初始化设置的内存的大小。Maximum memory pool这个是最大内存的大小。 设置完了就按确定然后再重启TOMCAT你就会发现tomcat中jvm可用的内存改变了。

 

          4. Eclipse中修改JVM内存

 

 

Eclipse->Window->Preferences->Server->Runtime Environments->选中Apache Tomcat v5.0->点击Edit按钮->在弹出对话框里点击JRE后面的Installed JREs按钮->在弹出对话框中选中tomcat使用的那个JRE->点击Edit按钮->在弹出对话框中,

 

找到Default VM Arguments,并在输入框中输入:-Xms110M -Xmx110M

 

 

 


 

然后我们在jvisualvm控制台可以看到:

 


 

 

 

其实除了进行常见的-Xms和-Xmx的设置外,还能对jvm参数进行如下的设置,下面接着说明jvm参数的常用配置。

 

四、jvm参数说明:

 

-server:一定要作为第一个参数,在多个CPU时性能佳
-Xms:java Heap初始大小。 默认是物理内存的1/64。
-Xmx:java heap最大值。不可超过物理内存。

 

 

-XX:PermSize:设定内存的永久保存区初始大小,用visualvm.exe可见其缺省值为64M。

 

-XX:MaxPermSize:设定内存的永久保存区最大 大小,用visualvm.exe可见其缺省值为64M。

 

 

 

-XX:SurvivorRatio=2:生还者池的大小,默认是2,如果垃圾回收变成了瓶颈,您可以尝试设置该值。

 

 -XX:NewSize:新生成的池的初始大小。 缺省值为2M。

 

-XX:MaxNewSize: 新生成的池的最大大小。   缺省值为32M。

 

如果 JVM 的堆大小大于 1GB,则应该使用值:-XX:newSize=640m -XX:MaxNewSize=640m -XX:SurvivorRatio=16,或者将堆的总大小的 50% 到 60% 分配给新生成的池。调大新对象区,减少Full GC次数。

 

 

 

 +XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。
-Xss:每个线程的Stack大小。
-verbose:gc 现实垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一
-XX:+UseParNewGC :缩短minor收集的时间
-XX:+UseConcMarkSweepGC :缩短major收集的时间 此选项在Heap Size 比较大而且Major收集时间较长的情况下使用更合适。

 

-XX:userParNewGC 可用来设置并行收集【多CPU】
-XX:ParallelGCThreads 可用来增加并行度【多CPU】
-XX:UseParallelGC 设置后可以使用并行清除收集器【多CPU】

 

五、关于垃圾收集的一些经验:

       另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集(Full GC)就会很慢, 但是频度会降低。如果你把堆的大小和内存的需要配置一致,完全收集(Full GC)就很快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性能,要把堆的大小设大,保证垃圾收集不在整个基准测试的过程中出现。  

       如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。

       一个要注意的地方:建议把内存的最高值跟最低值的差值缩小,不然会浪费很多内存的, 最低值加大 ,最高值可以随便设,但是要根据实际的物理内存 ,如果内存设置太大了,比如设置了512M最大内存,但如果没有512M可用内存,Tomcat就不能启动,还有可能存在内存被系统回收,终止进程的情况。

        六、 Tomcat 7中怎样查看内存的使用情况

 

1. 在$Tomcat_Home/conf/tomcat-users.xml下配置一个tomcat user,并使用http://localhost:8080/manager 访问。

<tomcat-users>
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <role rolename="manager-gui"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="role1" password="tomcat" roles="role1"/>
  <user username="swang6" password="swang6" roles="manager-gui"/>
</tomcat-users>

2. 点击右方的Server Status.



 

 

  • 大小: 31.1 KB
3
0
分享到:
评论
2 楼 turionboy 2013-11-11  
向博主学习了
1 楼 丿名人灬筱易 2013-11-11  
不错,转载了!

相关推荐

    解决jvmjava.net.BindException: Address already in use: JVM_Bind异常

    【Java中的`java.net.BindException: Address already in use: JVM_Bind`异常】 ...在日常开发和运维中,遇到此类问题时,应当耐心排查,从端口占用、JVM状态以及操作系统设置等多个角度进行检查。

    Tomcat给我的java.lang.OutOfMemoryError: PermGen

    首先,我们来看`java.lang.OutOfMemoryError: PermGen space`。PermGen全称为Permanent Generation space,是早期Java虚拟机(JVM)中的一种内存区域,主要用于存储类的元数据,包括类的加载器、类的名称、方法信息...

    解决tomcat在Debug模式下无法启动问题

    1. 检查JVM内存设置:如果内存不足,也可能导致Tomcat启动缓慢或失败。可以在Eclipse的服务器配置中调整Tomcat的内存参数,例如增加`-Xms`和`-Xmx`的值。 2. 配置Eclipse的Tomcat服务器实例:确保没有启用任何不必...

    JAVA项目在Tomcat下应用配置及问题总结.

    接下来,我们来看一下在实际操作过程中可能遇到的一些常见问题及其解决方案。 #### 二、常见问题及解决方法 1. **启动失败** - 检查环境变量是否正确设置。 - 查看Tomcat日志文件,寻找错误信息。 - 确保没有...

    OutOfMemory的一个解决方法

    在Java编程中,`OutOfMemoryError`是一种常见的运行时异常,它通常发生在JVM试图为新对象分配内存时,但堆内存空间已满或无法进一步扩展的情况下。这个错误可以分为几种类型,包括`PermGen space`、`Heap Space`、`...

    内存溢出及锁表问题的分析与解决.doc

    在 Java 中,内存的分配是由程序完成的,而内存的释放是由垃圾收集器(Garbage Collection,GC)完成的,程序员不需要通过调用 GC 函数来释放内存,因为不同的 JVM 实现者可能使用不同的算法管理 GC,有的是内存使用...

    zabbix_tomcat_weblogic监控模板.zip

    首先,我们来看“zabbix_tomcat_weblogic监控模板.zip”这个压缩包。它包含了两个核心文件:“zbx_weblogic_template.xml”和“zbx_tomcat_template.xml”,分别对应WebLogic和Tomcat的监控模板配置。这些模板不仅...

    myeclipse的常见问题

    首先,我们来看一个具体的问题:MyEclipse启动Tomcat时出现"Connection refused: connect"错误。这个错误通常发生在尝试停止已经运行的Tomcat实例时,系统无法连接到Tomcat的停止端口,从而导致Catalina.stop方法...

    线上排查思路,一些关于服务器排查的命令与案例

    下面将针对磁盘不足、CPU 过高和 Tomcat假死三种常见的问题进行排查思路和命令案例的讲解。 1. 磁盘不足 当磁盘不足时,应用会抛出异常。排查思路包括: 1.1.2.1 利用 df 查询磁盘状态,结果是: ``` df -h ``` ...

    350道Java面试真题2020版.pdf

    从提供的文件信息来看,该文件是一份包含350道Java面试真题的资料,涵盖了Java编程语言以及相关技术栈的多个方面。下面我将根据提供的标签和部分内容,详细介绍这份资料可能包含的知识点。 1. Java基础 Java基础...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    180多页面试题,前前后后不间断的更新了两年,准备换工作时,总是拿来看看,有比较好的面试题,也不间断的更新,面试题目录如下: 【基础】面向对象的特征有哪些方面 13 抽象 13 继承 13 封装 13 多态性 13 【基础】...

    java.lang.OutOfMemoryError: PermGen space及其解决方法

    ### Java.lang.OutOfMemoryError: PermGen space 及其解决方法 ...需要注意的是,虽然增加PermGen space的大小是一种简单直接的方法,但从长远来看,优化代码和类加载机制才是更为根本的解决方案。

    java面试题.rar

    首先,让我们来看看Java基础。Java的基础知识包括语法、面向对象编程(OOP)原则、异常处理、集合框架等。理解类、对象、封装、继承和多态是Java OOP的核心。异常处理是程序健壮性的保障,学习如何正确使用try-catch...

    myeclipse10 导出war崩溃

    可以尝试增加MyEclipse的JVM内存设置,例如增加`-Xms`和`-Xmx`参数。 4. **第三方库冲突**:项目中包含的第三方库可能存在版本冲突,这可能在导出过程中引起问题。检查并确认所有库都是兼容的,并且没有重复引入。 ...

    博客:本仓库存放个人博客的markdown源文件

    从标签来看,这些博客文章可能涵盖了多个关键领域,包括"blog"(博客)、"java"(Java编程语言)、"database"(数据库)、"jvm"(Java虚拟机)、"os"(操作系统)以及"interview"(面试)和"tomcat"(Tomcat服务器)...

    整理的2018 java面试汇总,要面试的抓紧看了

    以上是对Java面试中常见知识点的总结,涵盖了从基础概念到高级主题的多个方面。对于准备面试的候选人来说,理解并掌握这些知识点是非常重要的。同时,不断学习新技术和发展趋势也是保持竞争力的关键。希望这些总结...

    java解决org.springframework.web.context.ContextLoaderListener

    `ClassNotFoundException` 是Java中常见的异常,它表明JVM尝试加载一个类时,无法找到对应的字节码文件。在Spring框架中,这可能是因为缺少了Spring本身或者其他依赖库的JAR包。例如,如果你的WAR文件中没有包含必要...

Global site tag (gtag.js) - Google Analytics