感谢周志明所著的《深入理解Java虚拟机》一书。下面附上了一些我自己的理解。

java虚拟机(JVM)

当我们讨论到它的组成部分的时候,有人可能很多都会说是以栈和堆,但是实际上远远不止这两个部分。

下面我们来讲讲他的组成部分:

JVM分为两个区域:

一、线程私有区域

包含虚拟机栈(通常称为Java栈)、本地方法栈(储存JNI)、程序计数器

1、虚拟机栈

对应的就是认为的堆栈的栈,它生命周期与线程相同,描述的是Java内存执行的内存模型:每一个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,对应着一个栈帧在虚拟机栈种入栈到出栈的过程。

局部变量表中存放了编译器可知的各种基本数据类型(boolean、byte、char、short、int、float、double、long的引用和值,方法中的局部变量,执行完成之后就从栈中移除)、对象引用(reference类型,根据具体虚拟机实现,对应的可能是一个指向对象起始地址的引用指针【直接指针】,也可能是指向一个代表对象的句柄或其他与对象相关的位置【句柄池】)和returnAddress类型(指向一条字节码指令的地址)

其中64位长度的long和double类型数据会占2个局部变量内存空间(Slot),其他的数据类型占用1个。在进入一个方法的时候,这个方法需要在帧中分配多大的局部空间是完全确定的,在方法运行期间不会发生大小更改。

异常情况:线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展(当前大多虚拟机可动态扩展),如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。

2.本地方法栈

原理基本同虚拟机栈相同,区别在于虚拟机栈是为虚拟机执行java方法服务,而本地方法栈是为虚拟机执行Native方法服务

异常也会和虚拟机栈一样,会抛出StackOverflowError和OutOfMemoryError。

3.程序计数器

一块较小的内存空间,是当前线程所执行的字节码的行号指示器。程序计数器负责字节码解释器工作时通过它来选取下一条需要执行的字节码指令,如分支、循环、跳转、异常处理、线程恢复等基础功能。

多线程时,每个线程都有一个程序计数器,在线程切换的时候确保能准确正确定位到的执行位置,每个线程单独有一个程序计数器,它们之间互不影响,独立存储。

异常:java虚拟机中唯一一个没有规定OutOfMemoryError异常的区域

二、线程共享区域

包含方法区、堆

1.方法区

各线程共享的区域,方法区存储一杯虚拟机加载的类信息、常量、静态变量、即使编译器遍以后的代码等数据。是堆的一个逻辑部分,别名是Non-Heap(非堆)。

方法区在以前的虚拟机实现中,被列进了永久代中,由于应用的需求越来越大,方法区也跟着成倍的增加,再加上永久代有内存上限的限制,更容易遇到内存溢出问题,这样将方法区放在永久代就有点不合适,所以在jdk1.7中,其中的常量池从方法区中移除,放在了堆里。

异常:当方法区占用过大时,当没有内存可分配时,将会抛出OutOfMemoryError异常。

(1)运行时常量池

是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项就是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

2.堆

堆中有句柄池和类的实例对象。堆是所有线程共享的一块内存区域,在虚拟机启动时创建。所有的对象实例和数组都要在堆上分配,随着技术成熟,这种说法也不是那么绝对。

堆是垃圾收集器管理的主要区域,从内存回收角度考虑,由于现在都收集器基本都采用分代收集算法,所以堆被分为新生代和老年代;在细致一点就是 Eden空间、From Survivor空间、To Survivor空间等。

从内存分配角度,堆可能被分出多个线程私有的分配缓冲区。针对这部分主要分析的是内存的分配和回收。

成员变量存储在堆中的对象中,由垃圾回收器负责回收。

异常:如果堆中没有内存可以完成实例分配,并且也无法再扩展时,会抛出OutOfMemoryError异常。

3.直接内存

这不是严格的虚拟机规范中定义的内存区域。但是也会频繁使用,也可能导致OutOfMemoryError异常出现。

jdk1.4中新增NIO类(New Input/Output),引入了一种基于通道(Channel)与缓存区的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著的提高性能,避免了在Java堆和Native堆中来回复制数据。

本机直接内存分配不受到Java堆大小的限制,但是,既然是内存,肯定会受到本机总内存大小以及处理器寻址空间的限制。服务器管理员在配置虚拟机参数时,会根据实际内存设置-Xmx等参数信息,但经常忽略直接内存,使得各个内存区域总和大大于物理内存限制,从而导致动态扩展时出现OutOfMemoryError异常。

1.A a = new A();

分析:当前代码执行步骤:

(1)先在虚拟机栈中分配a的对象引用

(2)在堆中分配A类的对象实例

(3)将虚拟机栈中a的引用指向堆中分配的内存。

2.String str = “abc”;

分析:当前代码执行步骤

(1)将引用str存储在栈中

(2)在常量池中查找是否有字符串对象“abc”,若没有就在常量池中创建“abc”字符串

(3)将str指向“abc”字符串对象

3.String str = new String(“abc”);

分析:当前代码执行步骤

(1)在虚拟机栈中分配引用str内存

(2)在堆中创建String实例对象

(3)然后在常量池中寻找是否有“abc”字符串对象,没有就创建“abc”字符串对象

(4)将堆实例指向“abc”

(5)将虚拟机栈中str指向堆中的String实例对象

Java虚拟机组成部分及作用相关推荐

  1. 《java虚拟机规范SE7》整理——第二章:Java虚拟机结构

    按照<java虚拟机规范SE7>章节顺序整理的笔记. 第二章:java虚拟机的结构 目录: 数据类型 运行时数据区 栈帧 浮点算法 字节码指令集 一. 数据类型 虚拟机可以操作的类型可以分 ...

  2. JavaEE - JVM Java虚拟机

    JVM 大家重点掌握的是垃圾回收算法(引用计数+可达性分析+标记清除+标记整理+复制算法+分代回收) 课程目标: 1. 了解 JVM 的发展史 2. 了解 JVM 运行原理 3. 掌握 JVM 基本组 ...

  3. JVM规范系列第2章:Java虚拟机结构

    本规范描述的是一种抽象化的虚拟机的行为,而不是任何一种(译者注:包括 Oracle 公司自己的 HotSpot 和 JRockit 虚拟机)被广泛使用的虚拟机实现. 记住:JVM规范是一种高度抽象行为 ...

  4. Java虚拟机JVM简单理解

    Java虚拟机JVM的作用: Java源文件(.java)通过编译器编译成.class文件,.class文件通过JVM中的解释器解释成特定机器上的机器代码,从而实现Java语言的跨平台. JVM的体系 ...

  5. 虚拟机与Java虚拟机

    虚拟机 所谓虚拟机(Virtual Machine),就是一台虚拟的计算机.它是一款软件,用来执行一系列虚拟计算机指令.大体上,虚拟机可以分为系统虚拟机和程序虚拟机. 大名鼎鼎的Visual Box, ...

  6. 深入理解java虚拟机之java内存区域

    java虚拟机在执行java程序的时候会把它所管理的内存分为多个不同的区域,每个区域都有不同的作用,以及由各自的生命周期,有些随着虚拟机进行的启动而存在,有些区域则依赖于用户线程的启动或结束而建立或销 ...

  7. java虚拟机(1)

    java虚拟机 Java虚拟机(1) Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成. JVM平台的各种语言可以共享Jav ...

  8. 一、JAVA虚拟机------JVM自动内存管理

    JVM自动内存管理 一.JAVA内存区与内存溢出 1.1 概述 1.2 运行时数据区 1.2.1 程序计数器 (Program Counter Register) 1.2.2 Java虚拟机栈(Jav ...

  9. 1、Java虚拟机的事儿

    转载 收录jvm常见问题内容,后续规划-根据<深入理解Java虚拟机:JVM高级特性与最佳实践>结合理论+实际演练整理完善细分知识点: 走进java虚拟机 什么是虚拟机? Java 虚拟机 ...

最新文章

  1. Oracle导入导出dmp文件
  2. 【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路
  3. 云南省2021高考成绩查询时间,2021云南高考成绩什么时候几点可以查
  4. Java资深反射玩家
  5. java商城开发_javaweb实战之商城项目开发(一)
  6. 给echarts添加筛选时间控件时,控件不显示,并设置数据库无数据时echarts模块显示暂无数据
  7. [css] 如何隐藏没有静音、自动播放的音视频?
  8. 架构设计(6)---Web架构师究竟都要学些什么?
  9. 视频信息查看,帧信息查看
  10. ajax获取数据中文乱码问题最简单的完美解决方案
  11. 下载安装python函数库
  12. Python list列表查找元素
  13. 最强大脑记忆曲线(6)——字词录入页设计
  14. 多个category实现同一个方法调用的顺序
  15. 解决Linux上rar压缩包文件无法解压缩的问题
  16. css绝对定位如何居中?css绝对定位居中的四种实现方法-web前端教程
  17. Oracle数据库,创建表并给表、字段添加注释
  18. 中电海康校招面试数据存储与处理事业部
  19. pip速度慢,更换清华镜像源试试?
  20. javax.validation.constraints.NotNull找不到

热门文章

  1. 自动化测试成熟度模型
  2. rundeck上创建project和job
  3. 新族(CZoneSoft)工程项目合同管理软件
  4. Lumerical官方案例、FDTD时域有限差分法仿真学习(四)——环形调制器 - 瞬态响应 (Ring modulator - transient response ,varFDTD)
  5. 【C51单片机】声控LED智能灯
  6. 自然语言处理中的语言模型预训练方法(ELMo、GPT和BERT)
  7. arm_GPIO_简单编程例题
  8. 百度地图、高德地图都用POI吸引你,不过它到底是什么?
  9. 中文SEO的发展困惑
  10. 热力学分布用matlab,模拟技术在普通物理教学中的应用