tomcat内存溢出怎么解决

tomcat内存溢出怎么解决,第1张

JVM管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。一、内存溢出类型1、java.lang.OutOfMemoryError:PermGenspaceJVM管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。如果webapp用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。PermGenspace的全称是PermanentGenerationspace,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC(GarbageCollection)不会在主程序运行期对PermGenspace进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGenspace错误,这种错误常见在web服务器对JSP进行precompile的时候。如果你的厅镇WEBAPP下都用了大量的第三方jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。一个最佳的配置例子:(经过本人验证,自从用此配置之后,再未出现过tomcat死掉的情况)setJAVA_OPTS=-Xms800m-Xmx800m-XX:PermSize=128M-XX:MaxNewSize=256m-XX:MaxPermSize=256m2、java.lang.OutOfMemoryError:Javaheapspace第一种情况是个补充,主要存在问题就是出现在这个情况中。其默认空间(即-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,若连续回收都解决不了内存堆不足的问题时,就会报outofmemory错误。因为这个异常根据系统运行环境决定,所以无法预期它何时出现。根据GC的机制,程序的运行会引起系统运行环境的变化,增加GC的触发机会。为了避免这些问题,程序的设计和编写就应避免垃圾对象的内存占用和GC的开销。显示调用System.GC()只能建议JVM需要在内存中对垃圾对象进行回收,但不是必须马上回收,一个是并不能解决内存资源耗空的局面,另外也会增加GC的消耗。二、JVM内存区域组成简单的说java中的堆和栈java把内存分两种:一种是栈内存,另一种是堆内存1、在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配2、堆内存用来存放由new创建的对象和数组在函数(代码块)中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的内存空间在堆中分配的内存由java虚拟机的自动垃圾回收器来管理堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。缺点就是要在运行时动态分配内存,存取速度较慢栈的优势是存取速度比堆要快,缺点是存在栈中的数据大小与生存期必须是确定的无灵活性。java堆分为三个区:New、Old和PermanentGC有两个线程:新创建的对象被分配到New区,当该区被填满时会被GC辅助线程移到Old区,当Old区也填满了会触发GC主线程遍历堆内存里的所有对象。Old区的大小等于Xmx减去-Xmnjava栈存放栈调整:参数有+UseDefaultStackSize-Xss256K,表示每个线程可申请256k的栈空间每个线程都有他自己的Stack三、JVM如何设置虚拟内存提示:在JVM中如果98%的时间是用于GC且可用的Heapsize不足2%的时候将抛出此异常信息。提示:HeapSize最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。提示:JVM初始分配的内存由-Xms指定,默认是物理内存的1/64JVM最大分配的内存由-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。解决方法:手动设置Heapsize修改TOMCAT_HOME/bin/catalina.bat在“echo"UsingCATALINA_BASE:$CATALINA_BASE"”上面加入以下行:JAVA_OPTS="-server-Xms800m-Xmx800m-XX:MaxNewSize=256m"四、性能检查工具使用定位内存泄漏:JProfiler工具主要用于检查和跟踪系统(限于Java开发的)的性能。JProfiler可以通过时时的监控系统的内存使用情况,随时监视垃圾回收,线程运行状况等手段,从而很好的监视JVM运行情况及其性能。1.应用服务器内存长期不合理占用,内存经常处于高位占用,很难回收到低位

怎么知道tomcat服务器内存溢出了呢?看一下cmd命令行显示的内容就知道兆则雀了,java.lang.OutOfMemoryError: PermGen space就是内存溢出

找到tomcat路径,用编辑器打开catalina.sh

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

JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m

保存后,重新启动tomcat服务器,这时候应该正常了,如果还是提示内存溢出,只能是下面的这种情况了

内存溢出的另外一种情况就是:电脑内存不够了!这种情况是很有可能发生了,出现内存溢出的时候大家可以检查一下。

这种电脑内族早存不够,只盯皮能建议大家给电脑加一根内存条,不加就删除一些程序,清理一下电脑。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12467096.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存