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个区域随线程而生,随线程而灭.
随机推荐
- luoguP2826 LJJ的数学课
思路 把公式拆开维护两个值,一个a[i]的总和,一个a[i]*i的总和 也可以用树状数组维护,模板题 代码 #include <iostream> #include <vector& ...
- JavaScript:正则表达式 前瞻 找位置
js中全部都是顺序环视 顺序环视匹配过程 对于顺序肯定环视(?=Expression)来说,当子表达式Expression匹配成功时,(?=Expression)匹配成功,并报告(?=Expressi ...
- 九数组分数|2015年蓝桥杯B组题解析第五题-fishers
九数组分数 1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法? 下面的程序实现了该功能,请填写划线部分缺失的代码. #include <stdio.h> void t ...
- HDU 2571(dp)题解
命运 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- POJ1251 Jungle Roads (最小生成树&Kruskal&Prim)题解
题意: 输入n,然后接下来有n-1行表示边的加边的权值情况.如A 2 B 12 I 25 表示A有两个邻点,B和I,A-B权值是12,A-I权值是25.求连接这棵树的最小权值. 思路: 一开始是在做莫 ...
- spring集成mybatis后,打印SQL语句
网上说mybatis的早前版本配置打印sql还比较简单,在3.0.6之后配置方式修改了. 现在的spring-mybatis.xml配置如下: <bean id="sqlSession ...
- 【集群搭建】Zookeeper集群环境配置
1.下载解压安装文件 2.配置文件:conf/zoo.cfg tickTime=2000 dataDir=/usr/sunny/logs/zookeeper/data dataLogDir=/usr/ ...
- Wannafly 挑战赛22 D 整数序列 线段树 区间更新,区间查询
题目链接:https://www.nowcoder.com/acm/contest/160/D 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K ...
- 论文笔记——SQUEEZENET ALEXNET-LEVEL ACCURACY WITH 50X FEWER PARAMETERS AND <0.5MB MODEL SIZE
论文地址:https://arxiv.org/abs/1602.07360 模型地址:https://github.com/DeepScale/SqueezeNet 1. 论文思想 提出一种新的卷积组 ...
- 如何给域名配置https证书
http和https的区别就是,后者在网络传输过程中会很安全,原因就是给http安装了SSL证书. SSL证书有免费的和收费的,收费的顾名思义就是保护的方面更多,更安全.收费的像单域名的一年有几百.几 ...