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个区域随线程而生,随线程而灭.
随机推荐
- Sql 最简单的Sqlserver连接
string name = txtUserName.Text.Trim();//移除用户名前部和后部的空格 string pwd = txtUserPwd.Text.Trim();//移除密码前部和后 ...
- UVa 10570 外星人聚会
https://vjudge.net/problem/UVA-10570 题意:输入1~n的排列,每次可以交换两个整数,求出最少交换次数使之变成有序的环状序列. 思路:主要的解题方法就是寻找置换环,举 ...
- HDU 1248 寒冰王座(完全背包)
http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 商店里只有三种物品,价格分别为150,200,350.输入钱并计算浪费的钱的最小值,商店不找零. ...
- mvc ---- ajax 提交 (ckeditor)富文本框 提示潜在危险 Request.Form
ajax 提交 ckeditor 中的内容怎么提交都提交不了,折腾半天,后来终于找到问题 在你的方法头上加 [HttpPost] [ValidateInput(false)] public Actio ...
- Python写ROS 订阅与发布程序
1. 编写talker代码 vim ..../src/talker.py #!/usr/bin/env python # license removed for brevity import rosp ...
- python 元组切片
#create a tuple tuplex = (, , , , , , , , , ) #used tuple[start:stop] the start index is inclusive a ...
- 【Tomcat】tomcat热部署和热加载(转载)
我在项目开发过程中,经常要改动JAVA/JSP 文件,但是又不想从新启动服务器(服务器从新启动花时间),想直接获得(debug)结果.有两种方式热部署 和热加载: 1.热加载:在server.xml ...
- 使用 dplyr 管道操作处理数据框
关于数据操作的另一个流行的包是dplyr,它发明了一种数据操作语法.dplyr 扩展包并没有使用构建子集函数([ ]),而是定义了一系列基础的变形函数作为数据操作模块,并且引入了一个管道操作符,利用管 ...
- 安装gcc4.8.5
安装gcc4.8.51. g++ --version, 4.4.7不支持c++112. 升级gcc-c++, 下载gcc https://gcc.gnu.org/ 官网,镜像下载地址https: ...
- LeetCode--058--最后一个单词的长度
问题描述 给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 说明:一个单词是指由字母组成,但不包含任何空格的字符串. 示例: 输入: ...