tomcat内存配置

1、堆内存,首先是:java.lang.OutOfMemoryError:Javaheapspace解释:Heapsize设置JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heapsize的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn-Xms-Xmx等选项可进行设置

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

2、非堆内存,java.lang.OutOfMemoryError:PermGenspace原因:PermGenspace的全称是PermanentGenerationspace,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC(GarbageCollection)不会在主程序运行期对PermGenspace进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGenspace错误,这种错误常见在web服务器对JSP进行precompile的时候。如果你的WEBAPP下都用了大量的第三方jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。

3:如果用startup.bat,tomcat8.exe窗口启动

修改E:\apachetomcatztgj\bin\catalina.bat

注释的第一行后面增加

rem----------------------------------------

setJAVA_OPTS=-Xms512m-Xmx1024m-XX:PermSize=512M-XX:MaxNewSize=256m-XX:MaxPermSize=1024m

只修改这一个地方就可以了

4:如果以服务方式,只修改tomcat8w.exe就可以了,在services.msc中把tomcat修改为自动启动就可以了,不用修改catalina.bat

java

javaoptions:增加

-XX:PermSize=512M

-XX:MaxPermSize=1024M

Initialmemorypool:1024M

Maximummemorypool:1024M

配置遇到的问题:

1:先在bin下面安装tomcat服务器,要用管理员运行cmd

services.batinstalltomcat8

=====项目中Idea工具jdk内存的配置

-server-Xms256M-Xmx1024M-XX:PermSize=512m-XX:MaxPermSize=512m

================扩展===============

Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机。Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对JavaJVM有关内存方面的知识进行详细介绍。

一、JavaJVM内存介绍

JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在Java虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heapmemory)”。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中,它和堆不同,运行期内GC不会释放其空间。

(1).堆内存分配

JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC后调整堆的大小。可以利用JVM提供的-Xmn-Xms-Xmx等选项可进行堆内存设置,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值,建议堆的最大值设置为可用内存的最大值的80%。

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

(2).非堆内存分配

也叫永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域。它和存放类实例(Instance)的Heap区域不同,GC(GarbageCollection)不会在主程序运行期对PermGenspace进行清理。JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。GC不会对PermGenspace进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGenspace错误。

(3).JVM内存限制(最大值)

首先JVM内存限制于实际的最大物理内存(废话!,呵呵),假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了。

二、三种内存溢出异常介绍

1.OutOfMemoryError:Javaheapspace堆溢出

内存溢出主要存在问题就是出现在这个情况中。当在JVM中如果98%的时间是用于GC且可用的Heapsize不足2%的时候将抛出此异常信息。

2.OutOfMemoryError:PermGenspace非堆溢出(永久保存区域溢出)

这种错误常见在web服务器对JSP进行precompile的时候。如果你的WEBAPP下都用了大量的第三方jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。如果webapp用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。

3.OutOfMemoryError:unabletocreatenewnativethread.无法创建新的线程

这种现象比较少见,也比较奇怪,主要是和jvm与系统内存的比例有关。这种怪事是因为JVM已经被系统分配了大量的内存(比如1.5G),并且它至少要占用可用内存的一半。

三、JavaJVM内存配置

1.JVM内存分配设置的参数有四个

-XmxJavaHeap最大值,默认值为物理内存的1/4;

-XmsJavaHeap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;

-XmnJavaHeapYoung区大小,不熟悉最好保留默认值;

-Xss每个线程的Stack大小,不熟悉最好保留默认值;

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

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

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

-XX:NewSize:设置JVM堆的‘新生代’的默认大小;

-XX:MaxNewSize:设置JVM堆的‘新生代’的最大大小;

===========查看tomct内存使用情况===============

编辑tomcat-users.xml文件

配置

<rolerolename="manager-gui"/>

<userusername="admin"password="admin"roles="manager-gui"/>

重启tomcat

运行http://localhost:8080/

点击serverstatus

输入adminadmin

进去查看tomcat内存使用情况

JVM内存区域划分EdenSpace、SurvivorSpace、TenuredGen,PermGen解释2014-11-1216:53:53

分类:Java

jvm区域总体分两类,heap区和非heap区。heap区又分:EdenSpace(伊甸园)、SurvivorSpace(幸存者区)、TenuredGen(老年代-养老区)。非heap区又分:CodeCache(代码缓存区)、PermGen(永久代)、JvmStack(java虚拟机栈)、LocalMethodStatck(本地方法栈)。

HotSpot虚拟机GC算法采用分代收集算法:

1、一个人(对象)出来(new出来)后会在EdenSpace(伊甸园)无忧无虑的生活,直到GC到来打破了他们平静的生活。GC会逐一问清楚每个对象的情况,有没有钱(此对象的引用)啊,因为GC想赚钱呀,有钱的才可以敲诈嘛。然后富人就会进入SurvivorSpace(幸存者区),穷人的就直接kill掉。

2、并不是进入SurvivorSpace(幸存者区)后就保证人身是安全的,但至少可以活段时间。GC会定期(可以自定义)会对这些人进行敲诈,亿万富翁每次都给钱,GC很满意,就让其进入了GenuredGen(养老区)。万元户经不住几次敲诈就没钱了,GC看没有啥价值啦,就直接kill掉了。

3、进入到养老区的人基本就可以保证人身安全啦,但是亿万富豪有的也会挥霍成穷光蛋,只要钱没了,GC还是kill掉。

分区的目的:新生区由于对象产生的比较多并且大都是朝生夕灭的,所以直接采用标记-清理算法。而养老区生命力很强,则采用复制算法,针对不同情况使用不同算法。

非heap区域中PermGen中放着类、方法的定义,jvmStack区域放着方法参数、局域变量等的引用,方法执行顺序按照栈的先入后出方式。

以下转自:http://www.cnblogs.com/xhr8334/archive/2011/12/01/2270994.html

GC工作机制

SUN的jvm内存池被划分为以下几个部分:

EdenSpace(heap)

内存最初从这个线程池分配给大部分对象。

SurvivorSpace(heap)

用于保存在edenspace内存池中经过垃圾回收后没有被回收的对象。

TenuredGeneration(heap)

用于保持已经在survivorspace内存池中存在了一段时间的对象。

PermanentGeneration(non-heap)

保存虚拟机自己的静态(reflective)数据,例如类(class)和方法(method)对象。Java虚拟机共享这些类数据。这个区域被分割为只读的和只写的。

CodeCache(non-heap)

HotSpotJava虚拟机包括一个用于编译和保存本地代码(nativecode)的内存,叫做“代码缓存区”(codecache)。

简单来讲,jvm的内存回收过程是这样的:

对象在EdenSpace创建,当EdenSpace满了的时候,gc就把所有在EdenSpace中的对象扫描一次,把所有有效的对象复制到第一个SurvivorSpace,同时把无效的对象所占用的空间释放。当EdenSpace再次变满了的时候,就启动移动程序把EdenSpace中有效的对象复制到第二个SurvivorSpace,同时,也将第一个SurvivorSpace中的有效对象复制到第二个SurvivorSpace。如果填充到第二个SurvivorSpace中的有效对象被第一个SurvivorSpace或EdenSpace中的对象引用,那么这些对象就是长期存在的,此时这些对象将被复制到PermanentGeneration。

若垃圾收集器依据这种小幅度的调整收集不能腾出足够的空间,就会运行FullGC,此时jvmgc停止所有在堆中运行的线程并执行清除动作。

相关推荐