如果JVM里运行的程序
它的内存堆和持久存储区域的都满了
这个时候程序还想创建对象实例的话
垃圾收集器就会启动
试图释放足够的内存来创建这个对象
这个时候如果垃圾收集器 没有能力释放出足够的内存
它就会抛出OutOfMemoryError内存溢出错误
SUN JVM的内存管理方式
SUN的JVM是类似人类家族也就是在一个地方创建对象在它长期占据空间之前给它多次死亡的机会SUN JVM会划分为
年轻的一代(Young generation)包括EDEN和个幸存者空间(出发地和目的地the From space and the To space)
老一代(Old generation)
永久的一代(Permanent generation)
Java虚拟机的运行时数据区一般分类如下(不一定是物理划分)
堆主要存放对象实例线程共享
栈主要存储特定线程的方法调用状态线程独占
本地方法栈存储本地方法的调用状态线程独占
PC寄存器学过操作系统课程的都知道线程独占
方法区主要存储了类型信息线程共享
因此在抛出内存溢出错误的时候一般都会提示内存洩露的种类一般也都是按照区域进行划分
堆(heap)内存洩漏javalangOutOfMemoryError: Javaheap space:大家都比较熟悉 通过设置Xmsm Xmxm可以解决
栈(stack)内存洩漏当前线程运行期间维护的中间变量等信息过多例如常见的死循环引起stack over flow
方法区(permanent heap)内存洩漏即javalangOutOfMemoryError: PermGen space:发生的原因和类型装载类型卸载有直接的关系通过设置XX:MaxNewSize=m XX:MaxPermSize=m可以解决
一般情况下当服务器内存过小而提供了大量的访问服务时可能会缓存过多的数据对象造成堆内存溢出当web应用不断扩大加载的lib库达到一定大小(M)后就容易报PermGen OOM也就是方法区溢出
在Linux服务器中将参数写入环境变量
export CATALINA_OPTS=Xmsm Xmxm export JAVA_OPTS=XX:MaxNewSize=m XX:MaxPermSize=m Xmx 最大不要超过服务器物理内存的%