本文主要介绍了Tomcat运行的Java Web中内存溢出的实例分析,非常详细,具有一定的参考价值。感兴趣的朋友一定要看完!
如果在JVM中运行的程序,其内存堆和持久存储区已满,此时程序仍然想创建一个对象实例,垃圾收集器就会启动,试图释放足够的内存来创建这个对象。此时,如果垃圾收集器无法释放足够的内存,它将抛出OutOfMemoryError内存溢出错误。
SUN JVM的内存管理方式:
SUN JVM类似于人类家族,就是在一个地方创建一个对象,在它长时间占用空间之前,给它多次死亡的机会。SUN JVM将分为:
1.年轻一代,包括伊甸园和两个幸存者空间(从空间和到空间)。
2.老一辈(老一代)
3.*** '的一代(永久一代)
Java虚拟机的运行时数据区一般分类如下(不一定是物理划分):
1.堆:主要存储对象实例,由线程共享。
2.栈:主要存储特定线程的方法调用状态,线程是独占的。
3.本地方法栈:存储本地方法的调用状态,线程是独占的。
4.PC register:学过操作系统课程的人都知道线程是独占的。
5.方法区:主要存储类型信息和线程共享。
因此,在抛出内存溢出错误的时候,一般都会提示内存泄露的种类,一般也都是按照区域进行划分:
1.堆内存泄漏java.lang.out内存错误: Java堆空间:大家都很熟悉,可以通过设置-Xms2048m -Xmx4096m来解决。
2.堆栈内存泄漏:当前线程运行过程中维护的中间变量等信息太多,例如,常见的循环导致堆栈溢出。
3.方法区(永久堆)内存泄漏,即java.lang.out内存错误: perm gen space:原因与类型加载和类型卸载直接相关,可以通过设置-xx3360 max new size=256m-xx3360 max perm size=256m来解决。
通常,当服务器内存太小,无法提供大量的访问服务时,可能会缓存过多的数据对象,导致堆内存溢出。当web应用程序继续扩展,加载的lib库达到一定大小(4M)时,很容易报告PermGen OOM,即方法区溢出。
在Linux服务器中将参数写入环境变量:
导出catalina _ opts='-xms 2048m-xmx 4096m '导出Java _ opts='-xx3360max新大小=256m-xx3360max perm大小=256m' xmx * *不要超过服务器物理内存的80%。
以上就是《Tomcat运行的Java Web内存溢出分析》一文的全部内容。感谢您的阅读!希望分享的内容对大家有所帮助。更多相关知识,请关注行业资讯频道!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/143183.html