您的位置:首页 > 编程语言 > Java开发

深入java虚拟机 1 java内存区域与内存溢出的异常

2013-12-14 11:13 302 查看
java虚拟机运行时候的数据区域








程序计数器:字节码解释器通过改变程序计数器来取得下一条字节码指令,分支 循环 跳转,异常处理等操作都依赖程序计数器。
每一个线程都有自己独占的程序计数器。
方法区:method area,用户存储被虚拟机加载的类信息,常量,静态变量,及时编译后的代码。在Hotspot虚拟机上叫做永久代(permanent generation),在这个区域上的内存回收主要是对类的卸载和对常量池的回收。
运行时常量池:运行时常量池 是方法区的一部分,class文件除了版本 字段,接口等描述外,有一个 constant pool table(常量表)用于报春编译期间生成的各种字面量和符号引用,这部分内容将在类加载后放入到运行时常量池中。并非是编译是产生的常量才能进入运行时常量池,运行期间也可以动态加入,比如String.intern方法。
java虚拟机栈:每一个线程都有自己独占的java虚拟机栈,这里的栈可以看成是 虚拟机栈中的局部变量表:各种基本类型,对象引用的句柄 returnAddress。这个区域可能有 StackOverFlowError和OutOfMemoryError两种类型的异常。
本地方法栈:与java虚拟机栈一样,只不做这里执行的是native方法。HotSopt 虚拟机将 java虚拟机栈和本地方法栈合二为一了。
java堆:作用是存放对象实例,也是GC(garbage collection)内存回收的主要地方。这个堆还可以进一步划分(为了GC)为新生代和老年代。这个区域可能出现OutOfMemoryError异常。
直接内存 Direct Memory:在JDK1.4引入NIO后可以使用Native方法直接分配堆外内存,然后通过DirectByteBuffer对象对其进行操作。

JVM相应参数

-Xms20mjvm堆的最小值为20
-Xmx40mjvm堆的最大值为40
-XX:HeapDumpOnOutOfMemoryError当发生OutOfMemoryError内存溢出时候Dump当前内存快照,方便分析
-Xss128k栈的最大值为128k
-XX:PermSize=10Mjvm初始分配的非堆内存(方法区和常量池的大小)
-XX:MaxPermSize=100Mjvm分配的最大非堆内存(方法区和常量池的大小)
-XX:MaxDirectMemorySize=10M直接内存的最大值 如果不分配 与Xmx一样大
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: