Tomcat本身不能直接在计算机上运行,需要依赖于操作系统和一个JAVA虚拟机。Tomcat的内存溢出本质就是JVM内存溢出,JAVA程序启动时JVM会分配一个初始内存和最大内存给程序。当程序需要的内存超出内存的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。

1.Tomcat异常类型

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

  1. 1.  Java.lang.OutOfMemoryError:java heap space 堆溢出

解释说明:JVM在启动的时候会自动设置JVM Heap(java堆)的值,JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置。其初始空间默认是物理内存的1/64,最大空间不可超过物理内存的1/4(Tomcat默认可以使用的内存为128MB)。JVM提供-Xmn -Xms -Xmx等选项来进行相关设置。

出错场景:在JVM中,如果98%的时间是用于GC,且可用的Heap size不足2%时,将会出现JVM Heap溢出

解决方法:修改JVM Heap的大小。

  1. 2.  java.lang.OutOfMemoryError:PermGen space 非堆溢出

解释说明:PermGen space是指内存的永久保存区域。这个区域主要存放Class和Meta信息,Class在被Loader时就会被放入PermGen space。
    出错场景:常见于web服务器对JSP进行pre compile的时候, 如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
    解决方法:修改MaxPermSize大小。建议将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以减少jar 文档重复占用内存

  1. 3. 
    java.lang.OutOfMemoryError:unable to create new native thread.无法创建新的线程(较少见)

解释说明:这种现象比较少见,主要与JVM占用系统内存的比例有关,如果JVM占用的系统内存太大,导致创建线程所需要的物理内存有限。线程的大小是一定的,从而导致线程的数量受到限制。

解决方法:结合操作系统进行相关调整,结合不同情况对tomcat内存进行分配。

2.具体解决方法

前两种内存溢出通过设置tomcat的JVM配置进行解决。具体如下:

Linux(以1G内存为例):在%tomcat安装路径%/bin/catalina.sh文件中加入如下语句:

JAVA_OPTS='-server -Xms800m -Xmx800m -XX:PermSize=128m
-XX:MaxPermSize=128m'

其中:“m”说明单位是MB,否则默认是KB。

设置完后,需重新启动tomcat才生效。

1  java heap(java堆)设置

-Xms :Xms java Heap初始大小。
默认是物理内存的1/64;

-Xmx :java heap最大值。不超过物理内存的80%;

-Xmn :java heap最小值,一般设置为Xmx的4分之一;

备注:一般的要将-Xms和-Xmx选项设置为相同。

32位操作系统下JVM内存不超过2GB

2  PermGen space(永久保存区域)设置

-XX:PermSize:设定内存的永久保存区域;

-XX:MaxPermSize:设定最大内存的永久保存区域;

备注:-XX:MaxPermSize与-Xmx的总和不超过物理内存。

3  JVM其他参数:

-server/-client: 两个参数用于设置虚拟机使用何种运行模式,放在第一个

在windows上,缺省的虚拟机类型为client模式,client模式启动比较快,但运行时性能和内存管理效率不如server模式,通常用于客户端应用程序。

在Linux,Solaris上缺省采用server模式。server模式启动比client慢,但可获得更高的运行性能。对服务器端应用,推荐采用server模式,尤其是多个CPU的系统。

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

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

-verbose:gc 现实垃圾收集信息。

-Xloggc:gc.log 指定垃圾收集日志文件。

-XX:+UseParNewGC 缩短minor收集的时间。

-XX:+UseConcMarkSweepGC 缩短major收集的时间。

-XX:userParNewGC 可用来设置并行收集(多CPU)。

-XX:ParallelGCThreads 可用来增加并行度(多CPU)。

-XX:UseParallelGC 设置后可以使用并行清除收集器(多CPU)。

备注:查询Tomcat的JVM内存方法:

在%tomcat安装路径%/conf/tomcat-users.xml中添加如下语句:

开启tomcat后 访问port/manager/status并输入用户密码(port为自己定义的ip以及端口号)即可查看JVM参数值。

Tomcat的jvm配置的更多相关文章

  1. Tomcat中JVM内存溢出及合理配置及maxThreads如何配置(转)

    来源:http://www.tot.name/html/20150530/20150530102930.htm Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚 ...

  2. 配置Tomcat的JVM的大小解决Tomcat内存溢出的问题

    操作步骤如下图所示(图中也有对应的文字说明已比较详细,不再用文字做过多的解释): 1: 2: 3: 4: 5: 下面是配置的参数的说明: -Xms256m                     JV ...

  3. MyEclipse中Tomcat对应JVM的参数配置

    MyEclipse中Tomcat对应JVM的参数配置: -Xmx512M -Xms256M -XX:MaxPermSize=256m

  4. SpringBoot项目配置Tomcat和JVM参数

    设置Tomcat端口号和连接数等 使用application.properties配置文件有一些参数无法设置,所以推荐创建一个类文件来配置,如下: package com.qipai.springbe ...

  5. tomcat 的优化配置

    一.关于并发连接量的配置 在tomcat的server.xml配置文件中:将<Connector port="8080" protocol="HTTP/1.1&qu ...

  6. 转载:Tomcat的JVM设置和连接数设置

    Windows环境下修改“%TOMCAT_HOME%\bin\catalina.bat”文件,在文件开头增加如下设置:set JAVA_OPTS=-Xms256m -Xmx512m Linux环境下修 ...

  7. Tomcat(JVM)性能监控方法

    Tomcat(JVM)监控方法 1.Tomcat自带的监控页面 配置详见Tomcat安装配置监控一文,如图所示为监控页面: 2.LoadRunner编写脚本实现Tomcat监控 采用编写VuGen脚本 ...

  8. Tomcat安装、配置、优化及负载均衡详解

    一.常见JavaWeb服务器      1.WebLogic:是BEA公司的产品.WebSphereAS:是IBM公司的产品.JBossAS:红帽公司的产品,可以自行了解      2.Tomcat服 ...

  9. eclipse:Tomcat设置jvm,解决java.lang.OutOfMemoryError: Java heap space 堆内存溢出

    eclipse 有启动参数里设置jvm大小,因为eclipse运行时自己也需要jvm,所以eclipse.ini里设置的jvm大小不是具体某个程序运行时所用jvm的大小,这和具体程序运行的jvm大小无 ...

随机推荐

  1. hdu 4948 Kingdom(推论)

    hdu 4948 Kingdom(推论) 传送门 题意: 题目问从一个城市u到一个新的城市v的必要条件是存在 以下两种路径之一 u --> v u --> w -->v 询问任意一种 ...

  2. Uva 1103 古代象形符号(dfs求连通块, floodfill, 进制转换)

    题意: 给定一个H行W列的字符矩阵(H<200, W < 50), 输入的是一个十六进制字符, 代表一行四个相邻的二进制, 1代表像素, 0代表没有像素. 然后要求判断输入的是以下哪些图形 ...

  3. hadoop_exporter+prometheus

    1.准备工作 安装go.glibe(需要连google服务器,咋连的,我就不写了,因为尝试了各种办法,都失败了,很伤心) 2.下载hadoop_exporter cd /usr/local/prom/ ...

  4. 九度oj 题目1473:二进制数(stack)

    题目1473:二进制数 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:9371 解决:2631 题目描述: 大家都知道,数据在计算机里中存储是以二进制的形式存储的. 有一天,小明学了C语 ...

  5. windows 下 iptables

    windows自带的防火墙就可以. 在命令行方式下输入netsh回车,再输入firewall回车,之后想干什么就干什么. 头一次见对图形化防火墙头晕的...

  6. CSU 1225 最长上升子序列并记录其个数

    ;j<i;j++){ if(h[i] > h[j]){ ) cnt[i]+=cnt[j]; ) len[i] = len[j] + , cnt[i] = cnt[j]; } //身高相同的 ...

  7. Codeforces Round #264 (Div. 2) D

    题意: 给出最多5个序列,问这几个序列的最长公共子序列的长度是多少. solution : 脑抽级别我是,第一个序列每个数字位置固定,这样只要维护一个k-1维的偏序集就好了.然后在保证每个位置合法的情 ...

  8. [ C++ 快速高精度模板 ] [ BigN类 ] 大整数类 高精度 模板 BigInt FFT 快速傅里叶变换

    [原创 转载请注明]瞎写的,如果代码有错,或者各位大佬有什么意见建议,望不吝赐教 更新日志: 对于规模较小的整数乘法使用$$O(n^2)$$方法,提高速度 modify()和operator[]的bu ...

  9. 选学霸(codevs 3372)

    题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议.所以老师想请你帮他求出他该选多少学霸,才能既不让同 ...

  10. msp430入门学习13

    msp430的定时器--Timer_B(定时器B)