专栏首页漫漫架构路Java虚拟机原理(一)

Java虚拟机原理(一)

Java虚拟机内存模型

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

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

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中的所有线程共享。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ThreadPoolExecutor详解

    ThreadPoolExecutor是JDK提供的线程池的基类,其中定义了线程池的核心框架,并且允许客户端通过继承的方式实现自定义的线程池。JDK提供默认的几种...

    张申傲
  • RocketMQ详解(3)——RocketMQ集群模型与搭建

    RocketMQ天然支持分布式集群模型,其中主节点可读可写,从节点只可读,不可写,类似MySQL的主从模式。RocketMQ主要支持以下几种集群模型:

    张申傲
  • SpringBoot整合MyBatis原理

    SpringBoot提供了MyBatis的自动配置类MybatisAutoConfiguration,可以自动注册SqlSessionFactory、SqlSe...

    张申傲
  • 深入理解JVM的内存区域划分

    JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模...

    沁溪源
  • Java虚拟机运行时数据区精华总结

    Java虚拟机由三个子系统构成,分别是类加载子系统,JVM运行时数据区和执行引擎组成.一个Class文件先要经过类加载器–>运行时数据区–>执行引擎最终才会被执...

    TrueDei
  • Java虚拟机体系结构

    一个运行时的Java虚拟机实例的天职是:负责运行一个java程序。当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消...

    Java后端工程师
  • 【附答案】关于Java基础你不得不会的34个问题

    12. String StringBuffer 和 StringBuilder 的区别是什么 String 为什么是不可变的

    挨踢小子部落阁
  • JAVA核心技术学习笔记

    掌握Java核心技术是学习和掌握好Java技术的关键,下边分17个点对这些Java核心技术进行讲解。 >>>1.Java中没有多继承,而是用接口来代替多继承 >...

    企鹅号小编
  • JVM学习笔记

      java引用类型分为四种:类、接口、数组类和泛型参数。其中泛型参数会在编译过程中被擦除。因此 Java 虚拟机实际上只有前三种。在类、接口和数组类中,数组类...

    良辰美景TT
  • 2019年Java面试题基础系列228道(1),快看看哪些你还不会?

    2、访问修饰符 public,private,protected,以及不写(默认)时的区别?

    程序员追风

扫码关注云+社区

领取腾讯云代金券