码迷,mamicode.com
首页 > 其他好文 > 详细

jvm内存结构

时间:2018-05-04 11:46:27      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:class   超过   卸载   情况   异常   指示   技术分享   www   lower   

ref:http://www.cnblogs.com/ityouknow/p/5610232.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异常。

jvm内存结构

标签:class   超过   卸载   情况   异常   指示   技术分享   www   lower   

原文地址:https://www.cnblogs.com/whtblog/p/8989487.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!