Java虚拟机运行时数据区
运行时数据区
Java虚拟机在运行Java程序时,会将它所管理的内存划分为若干个内存区域。这些数据区域有各自的用途、以及创建和销毁时间。有的随着虚拟机启动而启动,有的区域则依赖java线程的启动和结束来建立和销毁。
Java虚拟机运行时数据区图如下(来自深入理解Java虚拟机:jvm的高级特性和实践):
以下对运行时数据区的各个区域做相应的解释:
程序计数器
程序计数器是一个较小的内存空间,可以把它看做当前线程执行的字节码时的行号指示器。字节码解释器的工作就是通过不断改变这个计数器来选择下一条需要执行的字节码指令、分支、循环等功能。
由于java的多线程是通过轮流切换线程分配处理器执行时间的方式来实现的,所以,在任何一个时间点,一个处理器只会执行一条线程中的指令。因此,为了能保证线程切换后能恢复到正确的位置,每条线程都需要有一个独立的程序计数器。各条线程计数器之间互不影响,独立存储。我们称这类内存区域为“线程私有”的内存。
如果线程正在执行的是一个java方法,计数器记录的是虚拟机正在执行的字节码指令地址。
如果线程正在执行的是一个Native方法,这个计数器值则为空。
此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError的情况的区域
总结:
- 程序计数器是一个较小的内存空间
- 每条线程都需要有一个独立的程序计数器
- 程序计数器就是一个(当前线程执行的字节码时的行号指示器)
- 不会出现OutOfMemoryError的情况
Java虚拟机栈
与程序计数器一样,虚拟机栈也是线程私有的,它的生命周期和线程相同。虚拟机栈描述的是java方法执行的内存模型:每个java方法在执行时都会创建一个栈帧(stack frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈出栈的过程。
总结:
- 虚拟机栈描述的是java方法执行时的内存模型
- 会抛出OutOfMemoryError和StackOverflowError异常
本地方法栈
本地方法栈和虚拟机栈所发挥的作用是非常相似的,只不过虚拟机栈是为java虚拟机执行java方法(字节码)而服务,而本地方法栈则是为了虚拟机中使用到的Native方法服务。
在虚拟机规范中没有明确规定本地方法栈使用的语言、数据结构没有强制约定。具体的虚拟机可以自由实现它。
总结:
- 本地方法栈和虚拟机栈作用类似,本地方法栈是为虚拟机中使用到的Native方法而服务,而虚拟机栈是为执行java方法而服务
- 虚拟机规范中没有明确规定本地方法栈使用何种语言、何种数据结构实现
Java堆(GC堆)
对于大多数应用来说,Java堆(Heap)是java虚拟机管理的最大一块内存区域,java堆是所有线程共享的一块内存区域,会在虚拟机启动时创建。
Java堆内存的唯一目的就是:存放对象实例
由于现在收集器都采用分代收集算法,所以java堆还可以分为新生代和老年代。
总结:
- java堆是虚拟机管理的最大一块内存区域
- java堆内存的目的就是存放对象实例
- 可以通过-Xmx和-Xms调整java堆内存大小
- 如果在堆中没有可用内存可以完成实例分配,并且堆无法再扩展时,会抛出OutOfMemoryError异常
方法区
方法区和Java堆一样,是被所有线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等。
该区域的内存回收目标主要是针对常量池的回收和对类型的卸载
总结:
- 方法区和Java堆一样,是被所有线程共享的内存区域
- 存储已被虚拟机加载的类信息、常量、静态变量
- 主要回收常量池和对类型的卸载
- 当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常
运行时常量池
运行时常量池是方法区的一部分,Class文件除了有类的版本、字段、方法、接口等描述信息外。还有一项重要信息就是常量池,用于存储编译器生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中。
总结:
- 存储编译器生成的各种字面量和符号引用
- 运行时常量池属于方法区的一部分,自然受到方法区内存限制,当常量池无法再申请到内存时会抛出OutOfMemoryError异常
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
Java虚拟机运行时数据区的更多相关文章
- 《深入理解Java虚拟机》(二)Java虚拟机运行时数据区
Java虚拟机运行时数据区 详解 2.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第二章 ,为了整理思路,简单记录一下,方便后期查阅. 2.2 运行时数据区域 Java虚拟机 ...
- 面试常问的 Java 虚拟机运行时数据区
写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...
- Java 虚拟机运行时数据区
写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...
- 【深入理解Java虚拟机】Java虚拟机运行时数据区
Java虚拟机运行时数据区 线程私有 程序计数器 1.当前线程所执行的字节码的行号指示器. 2.唯一不会发生OutOfMemoryError的区域 3.如果执行的是java方法,计数器值为虚拟机字节码 ...
- 笔记:Java虚拟机运行时数据区
Java虚拟机在执行Java程序的过程中会把它管的内存划分为以下若干个不同的区域: 1.程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器:由于Java虚拟机的 ...
- 【JVM从小白学成大佬】2.Java虚拟机运行时数据区
目录 1.运行时数据区介绍 2.堆(Heap) 是否可能有两个对象共用一段内存的事故? 3.方法区(Method Area) 4.程序计数器(Program Counter Register) 5.虚 ...
- 【JVM学习】2.Java虚拟机运行时数据区
来源: 公众号: 猿人谷 这里我们先说句题外话,相信大家在面试中经常被问到介绍Java内存模型,我在面试别人时也会经常问这个问题.但是,往往都会令我比较尴尬,我还话音未落,面试者就会"背诵& ...
- Java 虚拟机运行时数据区详解
本文摘自深入理解 Java 虚拟机第三版 概述 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟 ...
- 深入理解Java虚拟机&运行时数据区
其中,程序计数器.虚拟机栈.本地方法栈3个区域随线程而生,随线程而灭.
随机推荐
- 【附7】turbine
一.作用 聚集同一个微服务的相同的commandKey.Threadpool.commandGroupKey数据进行聚合 二.配置 1.集群(cluster)(turbine聚集数据的粒度) turb ...
- Kylin介绍
转:http://blog.csdn.net/yu616568/article/details/48103415 Kylin是ebay开发的一套OLAP系统,与Mondrian不同的是,它是一个MOL ...
- js清除未知定时器的方法
js清除未知定时器的方法 在需要有实时性更新数据的项目中,我们经常会用到很多定时器,我们可能需要一个可以一次性清除所有定时器的方法,并且不通过指定ID一个一个去清除,以下提供两种解决方案: 1.定 ...
- spring boot 无法读取application.properties问题
spring boot 无法读取application.properties问题 https://bbs.csdn.net/topics/392374488 Spring Boot 之注解@Compo ...
- CRLF line terminators导致shell脚本报错:command not found --转载
Linux和Windows文本文件的行结束标志不同.在Linux中,文本文件用"/n"表示回车换行,而Windows用"/r/n"表示回车换行.有时候在Wind ...
- 对Tomcat启动或运行时,项目对jar包依赖路径的一些粗浅认知
Tomcat在运行webapp项目的时候,需要各种依赖jar包.它会从2个地方去找这些包 1.Tomcat自己的lib目录中 2.webapp目录下,webapps\{项目}\WEB-INF\lib ...
- 【bzoj】3224: Tyvj 1728 普通平衡树
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 10097 Solved: 4302[Submit][St ...
- python 将列表中的字符串转为数字
本文实例讲述了Python中列表元素转为数字的方法.分享给大家供大家参考,具体如下: 有一个数字字符的列表: numbers = ['1', '5', '10', '8'] 想要把每个元素转换为数字: ...
- html 居中的内容显示框
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- django模型的继承
很多时候,我们都不是从‘一穷二白’开始编写模型的,有时候可以从第三方库中继承,有时候可以从以前的代码中继承,甚至现写一个模型用于被其它模型继承.这样做的好处,我就不赘述了,每个学习Django的人都非 ...