关闭

JVM内存模型学习

标签: jvm
75人阅读 评论(0) 收藏 举报
工作好几年了,第一次写博客,主要是最近学习下来,看过的东西如果不及时记录下来,则容易忘掉。所以记录在此,备忘!文采不好,有写的不对的地方,请大家及时批评指正,谢谢!
JVM内部分成5个区域:
    1):程序计数器;
    2):虚拟机栈;
    3):本地方法栈;
    4):方法区;
    5):堆;
1:程序计数器
    程序计数器是一块空间较小的内存,也是线程私有的内存。如果线程正在执行的是java方法,则计数器记录的是正在执行的虚拟机字节码指令的地址,如果是native方法,则计数器的值为空。程序计数器的内存区域是唯一一个在java虚拟机规范中没有定义任何OutOfMemory异常情况的区域。
2:虚拟机栈
    虚拟机栈也是线程私有的,生命周期与线程相同,虚拟机栈描述的是java方法的内存模型,每个方法的执行虚拟机都会创建一个叫栈桢的东西,栈桢里存放着这个方法中局部变量表,方法出口等一些方法信息。每个方法的调用与返回都伴随着栈桢的创建入栈和出栈。栈桢的局部变量表中存放着各种编译期知道的基本数据类型、对象引用等。
    虚拟机栈中有两种常见的异常:
        a:StackOverflowError:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出此异常。
        b:OutOfMemoryError: 如果线程的栈是可动态扩展的,但当动态扩展申请的内存不足时,将抛此异常。
3:本地方法栈:
    此内存区域和虚拟机栈的作用基本相同,不同的是,本地方法栈是native方法,虚拟机栈是java方法。有的虚拟机已经将这两个区域合并。
4:Java堆
    Java堆是jvm中最大的一个内存块,并且很多时候jvm的知识都是围绕这个java堆来进行的。java堆与栈不同,堆是所有线程共享的一块内存区域。它的作用主要是用来存放我们程序中产生的对象。
    目前比较流行的jvm虚拟机在垃圾回收中都使用分代收集算法,所以java堆一般都可以细分为:新年代和老年代。
    新年代还可以分为Eden空间、From Survivor、To Survivor空间。新对象刚被创建的时候一般会被分配到Eden空间,当经过一次垃圾回收时,会被分配到From Survivor或者To Survivor空间。当经过一定次数的垃圾回收后,对象依然还存在的话就会被分配到老年代空间。关于对象的分配以及垃圾回收,后面的文章有时间会更加的详细阐述,这里就不深入分析了。

5:方法区
    方法去也是所有线程共享的一块内存区域,用于存储虚拟机已经加载的类的信息、常量、静态变量、以及及时编译器编译后的代码数据。
    运行常量池是方法去的一部分,用于存放编译期生成的各种字面量和符号引用!不仅仅在编译期可以将变量放入常量池,在运行期同样也可以,类似于String.intern().

以上是jvm虚拟机最基本的5个分区简单总结,若有错误欢迎拍砖。之后将更加深入的了解几个重要的分区。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:195次
    • 积分:22
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档