zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Tomcat运行Java Web内存溢出总结

JAVATomcat内存Web 总结 运行 溢出
2023-09-11 14:20:53 时间

如果JVM里运行的程序, 它的内存堆和持久存储区域的都满了,这个时候程序还想创建对象实例的话,垃圾收集器就会启动,试图释放足够的内存来创建这个对象。这个时候如果垃圾收集器 没有能力释放出足够的内存,它就会抛出OutOfMemoryError内存溢出错误。

SUN JVM的内存管理方式:

SUN的JVM是类似人类家族,也就是在一个地方创建对象,在它长期占据空间之前给它多次死亡的机会,SUN JVM会划分为:

1、年轻的一代(Young generation),包括EDEN和2个幸存者空间(出发地和目的地the From space and the To space)

2、老一代(Old generation)

3、永久的一代(Permanent generation)

Java虚拟机的运行时数据区一般分类如下(不一定是物理划分):

1、堆:主要存放对象实例,线程共享

2、栈:主要存储特定线程的方法调用状态,线程独占

3、本地方法栈:存储本地方法的调用状态,线程独占

4、PC寄存器:学过操作系统课程的都知道,线程独占

5、方法区:主要存储了类型信息,线程共享

因此,在抛出内存溢出错误的时候,一般都会提示内存泄露的种类,一般也都是按照区域进行划分:

1、堆(heap)内存泄漏java.lang.OutOfMemoryError: Javaheap space:大家都比较熟悉 ,通过设置-Xms2048m -Xmx4096m可以解决

2、栈(stack)内存泄漏:当前线程运行期间维护的中间变量等信息过多,例如常见的死循环引起stack over flow

3、方法区(permanent heap)内存泄漏,即java.lang.OutOfMemoryError: PermGen space:发生的原因和类型装载、类型卸载有直接的关系,通过设置-XX:MaxNewSize=256m -XX:MaxPermSize=256m可以解决。

一般情况下,当服务器内存过小,而提供了大量的访问服务时,可能会缓存过多的数据对象造成堆内存溢出,当web应用不断扩大,加载的lib库达到一定大小(4M)后,就容易报PermGen OOM,也就是方法区溢出。

Linux服务器中将参数写入环境变量:

export CATALINA_OPTS="-Xms2048m -Xmx4096m"  export JAVA_OPTS="-XX:MaxNewSize=256m -XX:MaxPermSize=256m"

Xmx 最大不要超过服务器物理内存的80%


本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/


【高并发】高并发环境下如何防止Tomcat内存溢出?看完我懂了!! 随着系统并发量越来越高,Tomcat所占用的内存就会越来越大,如果对Tomcat的内存管理不当,则可能会引发Tomcat内存溢出的问题,那么,如何防止Tomcat内存溢出呢?我们今天就来一起探讨下这个问题。
Tomcat内存释放不了、Tomcat内存溢出原因 公司的tomcat又挂掉了,之前挂了一次.出现以下错误,后来把tomcat的内存增大到1024 严重: Exception initializing page context java.lang.OutOfMemoryError: Java heap space 在tomcat\bin\catalina.bat的set CURRENT_DIR=%cd% 前面添加 set JAVA_OPTS =-Xms512m -Xmx1024m 意思:设置最小虚拟内存512,最大1024.
开发踩坑记录之四:Tomcat内存溢出问题分析 系统平台运行一段时间后,平台出现无法访问的问题,重启对应的服务后平台恢复正常。查看日志发现在凌晨两点零四分之后没有对应的日志输出,直到重启服务后才有日志的正常输出。同时发现在Tomcat的目录下存在hprof文件,即java进程的内存镜像文件。初步猜测Tomcat发生了内存溢出导致服务出现假死现象,即在任务管理器中虽然为运行状态,但是实际已不能正常对外提供服务。   对于hprof文件的分析需要借助于内存分析工具Eclipse Memory Analyzer,通过它寻找到平台发生内存泄露的根源,再根据发生内存泄露的地方以及相关的日志信息定位什么样的业务场景下导致该异常情况的发生。