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. prometheus监控linux系统

    安装node exporter 创建Systemd服务 #vim /etc/systemd/system/node_exporter.service[Unit]Description=mysql_ex ...

  2. 阿里云ubuntu服务器安装使用mysql并配置远程连接记录

    实践2要继续做实践1的项目 项目在本地使用本地数据库对于团队开发来说太麻烦了 所以改把项目放在服务器上使用服务器数据库 进入主题 0.参考:https://www.cnblogs.com/ywf520 ...

  3. python标准库笔记

    1.python互联网数据处理模块 base64数据编码 二进制数据 encode ASCII字符 ASCll字符 decode 二进制数据 json数据交换格式 轻量的数据交换格式,json暴露的A ...

  4. Javascript类型转换的规则全面&附有实例

    Javascript的变量是松散类型的,它可以存储Javascript支持的任何数据类型,其变量的类型可以在运行时被动态改变.请看示例: 1 2 3 var n = 10; n = "hel ...

  5. hihoCoder#1082 然而沼跃鱼早就看穿了一切

    原题地址 字符串匹配+替换 注意替换串和原串长度是不等的,所以替换完还要进行收缩 可以顺带练习一下KMP 代码: #include <iostream> #include <cstr ...

  6. navicat mysql 连接本地 忘记密码 查看密码 操作

    https://jingyan.baidu.com/article/454316ab4e9e65f7a7c03ad1.html

  7. mysql控制流程函数(case,if,ifnull,nullif)

    1.case...when... 用法 参考:http://www.cnblogs.com/qlqwjy/p/7476533.html CASE value WHEN [compare-value] ...

  8. UVA 437_The Tower of Babylon

    题意: 一堆石头,给定长宽高,每种石头均可以使用无数次,问这堆石头可以叠放的最高高度,要求下面的石头的长和宽分别严格大于上面石头的长和宽. 分析: 采用DAG最长路算法,由于长宽较大,不能直接用于表示 ...

  9. 2014ACM/ICPC亚洲区西安站现场赛 F color(二项式反演)

    题意:小球排成一排,从m种颜色中选取k种颜色给n个球上色,要求相邻的球的颜色不同,求可行的方案数,答案模1e9+7.T组数据,1<= n, m <= 1e9, 1 <= k < ...

  10. Redis的集群方案之Sentinel(哨兵模式)(待实践)

    哨兵模式是主从切换的一种方案,但是可以借助此方案实现集群,达到高可用. 先收集教程,待实践. 参考: https://redis.io/topics/sentinel(官方文档) http://ife ...