前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java虚拟机原理(一)

Java虚拟机原理(一)

作者头像
张申傲
发布2020-09-03 10:29:15
1850
发布2020-09-03 10:29:15
举报
文章被收录于专栏:漫漫架构路漫漫架构路

Java虚拟机内存模型

Java虚拟机模型是Java程序运行的基础。为了能使程序正常运行,JVM将内存数据分为程序计数器、虚拟机栈、本地方法栈、Java堆和方法区等部分,如下图所示。

JVM内存模型
JVM内存模型

现将各部分具体介绍如下:

1.程序计数器

程序计数器(Program Counter Register)是一块很小的内存空间,用于存放下一条要运行的指令。由于Java是线程级别的语言,当线程数量超过CPU数量时,线程之间根据时间片轮询抢占CPU资源。对于单核CPU来说,每一个时刻只能有一个线程在运行,其他线程必须被切换出去。为此,每个线程必须用一个独立的程序计数器记录下一条将要运行的指令。各个线程之间的程序计数器独立工作、互不影响,是一块线程私有的内存空间。 如果当前线程正在执行一个Java方法,则程序计数器记录正在执行的Java字节码地址;如果正在执行一个native方法,则程序计数器为空。

2.Java虚拟机栈

Java虚拟机栈用于存放Java函数调用的堆栈信息,它也是线程私有的内存空间。Java虚拟机栈和Java线程同时创建,保存方法的局部变量和部分结果,并参与方法的调用和返回。 JVM规范允许Java栈的大小是动态的或者固定的。在JVM规范中定义了两种与栈空间相关的异常:StackOverflowErrorOutOfMemoryError。如果线程在计算过程中,请求栈的深度大于最大可用栈深度,则抛出StackOverflowError;如果Java栈可以动态扩展,而在扩展栈的过程中没有足够的空间支持,则抛出OutOfMemoryError

3.本地方法栈

本地方法栈和Java虚拟机栈的功能相似,Java虚拟机栈用于管理Java函数的调用,而本地方法栈用于管理native方法的调用。本地方法栈不是采用Java实现的,而是用C实现的。在SUN的Hot Spot中并不区分本地方法栈和虚拟机栈。 和Java虚拟机栈一样,本地方法栈也会抛出StackOverflowErrorOutOfMemoryError

4.Java堆

Java堆是Java运行时内存中最为重要的部分,几乎所有的对象和数组都是在堆中分配空间的。Java堆被所有的线程共享。 Java堆分为Young代和Old代两个部分。Young代用于存放刚刚创建的对象和年轻的对象,如果对象一直没有被回收,生存期足够长,则会被作为老年对象进入Old代。 Young代又进一步分为Eden、Survivor0和Survivor1三个区域。Eden意义为伊甸园,大部分刚刚创建的对象都保存在此区域。S0和S1为Survivor区域,表示幸存者,即其中的对象至少经历过一次垃圾回收且保留了下来。如果Survivor的的对象到了指定年龄(默认为15)仍未被回收,则有机会进入Old代。 关于Java堆的具体内容将在下一节详细阐述。

5.方法区

方法区也是JVM内存中非常重要的一块区域,主要用于保存常量和类的定义信息。与Java堆类似,方法区也被所有线程共享。 方法区中最为重要信息有:类的类型信息、常量池、域信息、方法信息等。这些信息大部分来自class字节码文件,是Java程序运行必不可少的重要数据。 在Hot Spot中,方法区也被称为永久区。虽然被称为永久区,但是也是可以被GC回收的。关于具体的垃圾回收机制,将在后文介绍。

总结

Java虚拟机将内存数据主要分为五个部分,包括:程序计数器、虚拟机栈、本地方法栈、Java堆和方法区。程序计数器用于保存下一条将要被执行的指令;Java虚拟机栈和本地方法栈分别存放Java方法和native方法的调用信息;Java堆保存的程序运行时所需的对象等数据;而方法区主要用于存放类的元数据信息。 其中,程序计数器、Java虚拟机栈和本地方法栈是线程私有的, 各个线程独立工作互不影响;而Java堆和方法区则被JVM中的所有线程共享。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-10-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java虚拟机内存模型
    • 1.程序计数器
      • 2.Java虚拟机栈
        • 3.本地方法栈
          • 4.Java堆
            • 5.方法区
              • 总结
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档