首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

JVM内存储器溢出的方式

2012-09-17 
JVM内存溢出的方式了解了Java虚拟机五个内存区域的作用后,下面我们来继续学习下在什么情况下这些区域会发

JVM内存溢出的方式

了解了Java虚拟机五个内存区域的作用后,下面我们来继续学习下在什么情况下

这些区域会发生溢出。
1.虚拟机参数配置
-Xms:初始堆大小,默认为物理内存的1/64(<1GB);默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制。

-Xmx:最大堆大小,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。

-Xss:每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。应根据应用的线程所需内存大小进行适当调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。一般小的应用, 如果栈不是很深, 应该是128k够用的,大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。

-XX:PermSize:设置永久代(perm gen)初始值。默认值为物理内存的1/64。

-XX:MaxPermSize:设置持久代最大值。物理内存的1/4。


2.方法区溢出
因为方法区是保存类的相关信息的,所以当我们加载过多的类时就会导致方法区溢出。在这里我们通过JDK动态代理和CGLIB代理两种方式来试图使方法区溢出。
2.1 JDK动态代理
package com.cdai.jvm.overflow;public class StackOverflow {private static int stackDepth = 1;public static void stackOverflow() {stackDepth++;stackOverflow();}public static void main(String[] args) {try {stackOverflow();} catch (Exception e) {System.err.println("Stack depth: " + stackDepth);e.printStackTrace();}}}

热点排行