jvm内存结构
Posted 一碗雪花
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jvm内存结构相关的知识,希望对你有一定的参考价值。
ref:http://www.cnblogs.com/ityouknow/p/5610232.html
暂不整理:JVM更多:http://www.cnblogs.com/ityouknow/category/437541.html
1、JVM的内存结构
1.1:Java程序交给JVM执行,因此Java的内存区域划分实际上是JVM的内存区域划分。
Java源代码(.java)->字节码文件(.class)->jvm加载字节码文件->jvm执行引擎
jvm执行Java程序时,会用一段空间(运行时数据区)存储执行期间的数据与相关信息。内存划分是对jvm运行时数据区进行的内存划分。
1.2、运行时数据区的划分:
堆内存:堆区是所有线程共享的区域。
方法区:又名非堆(Non-Heap),是线程共享区域。
栈 :是线程私有的。
程序计数器:线程私有。
2、各个分区的作用
2.1:堆(Heap):
2.1.1:根据jvm规范,该区域可以是物理上的不连续空间,当堆区无空间完成实例分配,页无法再扩展时,会抛出OutOfMemoryError异常。
2.1.2:几乎所有的实例对象的分配都在堆区完成。该区也是垃圾收集器(GC)管理的主要区域,一般采用分代收集算法进行回收。
2.1.3:堆区又分为新生代和老年代,新生代又分为:Eden空间、FromSurvivor空间和To Survivor空间,默认比例8:1:1。
2.2:方法区(Method Area):
2.2.1:该区存储已被jvm加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
2.2.2:该区的垃圾回收的主要对象是常量池和类型的卸载,也可以选择不实现垃圾回收。
2.2.3:内存分配无法满足时抛出OutOfMemoryError。
2.3:程序计数器(program counter register):
2.3.1:该区是当前线程所执行的字节码的行号指示器,是线程私有内存。
2.3.2:此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。
2.4:JVM栈(JVM Stacks):
2.4.1:该区描述Java方法执行的内存模型,每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
2.4.2:该区存在两种异常:
StackOverflowError异常:线程请求栈深超过jvm允许深度。
OutOfMemoryError异常:jvm无法申请足够的内存时。
2.5:本地方法栈(Native Method Stacks)
该区为jvm调用的Native方法服务,也会抛出StackOverflowError和OutOfMemoryError异常。
3:方法区详细:
http://www.cnblogs.com/protected/p/6419217.html
4、(补充)java中的强、软、弱、虚引用:java.lang.ref包
- 强引用:如下,a=null时,此时没有引用指向该A对象,应该被GC,但是由于B依赖A,A不能被GC,造成内存泄漏(A占的内存不会被释放);
A a=new A(); B b=new B(a); a=null;
- 软引用(SoftReference):多用于缓存处理:如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。常和一个引用队列搭配使用。
- 弱引用(WeakReference):a=null时,A只被弱引用依赖,A会被GC,避免了内存泄露。GC一旦扫描到弱引用直接回收。
A a = new A(); WeakReference b = new WeakReference(a);//B b = new B(a);a = null;
- 虚引用(PhantomReference):就是一个标识,对生命周期没有影响。
以上是关于jvm内存结构的主要内容,如果未能解决你的问题,请参考以下文章