运行时数据区

Java虚拟机在运行Java程序时,会将它所管理的内存划分为若干个内存区域。这些数据区域有各自的用途、以及创建和销毁时间。有的随着虚拟机启动而启动,有的区域则依赖java线程的启动和结束来建立和销毁。
Java虚拟机运行时数据区图如下(来自深入理解Java虚拟机:jvm的高级特性和实践):

以下对运行时数据区的各个区域做相应的解释:

程序计数器

程序计数器是一个较小的内存空间,可以把它看做当前线程执行的字节码时的行号指示器。字节码解释器的工作就是通过不断改变这个计数器来选择下一条需要执行的字节码指令、分支、循环等功能。
由于java的多线程是通过轮流切换线程分配处理器执行时间的方式来实现的,所以,在任何一个时间点,一个处理器只会执行一条线程中的指令。因此,为了能保证线程切换后能恢复到正确的位置,每条线程都需要有一个独立的程序计数器。各条线程计数器之间互不影响,独立存储。我们称这类内存区域为“线程私有”的内存。
如果线程正在执行的是一个java方法,计数器记录的是虚拟机正在执行的字节码指令地址。
如果线程正在执行的是一个Native方法,这个计数器值则为空。
此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError的情况的区域
总结:

  1. 程序计数器是一个较小的内存空间
  2. 每条线程都需要有一个独立的程序计数器
  3. 程序计数器就是一个(当前线程执行的字节码时的行号指示器)
  4. 不会出现OutOfMemoryError的情况

Java虚拟机栈

与程序计数器一样,虚拟机栈也是线程私有的,它的生命周期和线程相同。虚拟机栈描述的是java方法执行的内存模型:每个java方法在执行时都会创建一个栈帧(stack frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈出栈的过程。
总结:

  1. 虚拟机栈描述的是java方法执行时的内存模型
  2. 会抛出OutOfMemoryError和StackOverflowError异常

本地方法栈

本地方法栈和虚拟机栈所发挥的作用是非常相似的,只不过虚拟机栈是为java虚拟机执行java方法(字节码)而服务,而本地方法栈则是为了虚拟机中使用到的Native方法服务。
在虚拟机规范中没有明确规定本地方法栈使用的语言、数据结构没有强制约定。具体的虚拟机可以自由实现它。
总结:

  1. 本地方法栈和虚拟机栈作用类似,本地方法栈是为虚拟机中使用到的Native方法而服务,而虚拟机栈是为执行java方法而服务
  2. 虚拟机规范中没有明确规定本地方法栈使用何种语言、何种数据结构实现

Java堆(GC堆)

对于大多数应用来说,Java堆(Heap)是java虚拟机管理的最大一块内存区域,java堆是所有线程共享的一块内存区域,会在虚拟机启动时创建。
Java堆内存的唯一目的就是:存放对象实例
由于现在收集器都采用分代收集算法,所以java堆还可以分为新生代和老年代。
总结:

  1. java堆是虚拟机管理的最大一块内存区域
  2. java堆内存的目的就是存放对象实例
  3. 可以通过-Xmx和-Xms调整java堆内存大小
  4. 如果在堆中没有可用内存可以完成实例分配,并且堆无法再扩展时,会抛出OutOfMemoryError异常

方法区

方法区和Java堆一样,是被所有线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等。
该区域的内存回收目标主要是针对常量池的回收和对类型的卸载
总结:

  1. 方法区和Java堆一样,是被所有线程共享的内存区域
  2. 存储已被虚拟机加载的类信息、常量、静态变量
  3. 主要回收常量池和对类型的卸载
  4. 当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常
运行时常量池

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

  1. 存储编译器生成的各种字面量和符号引用
  2. 运行时常量池属于方法区的一部分,自然受到方法区内存限制,当常量池无法再申请到内存时会抛出OutOfMemoryError异常

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

 
 
 
 

Java虚拟机运行时数据区的更多相关文章

  1. 《深入理解Java虚拟机》(二)Java虚拟机运行时数据区

    Java虚拟机运行时数据区 详解 2.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第二章 ,为了整理思路,简单记录一下,方便后期查阅. 2.2 运行时数据区域 Java虚拟机 ...

  2. 面试常问的 Java 虚拟机运行时数据区

    写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...

  3. Java 虚拟机运行时数据区

    写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...

  4. 【深入理解Java虚拟机】Java虚拟机运行时数据区

    Java虚拟机运行时数据区 线程私有 程序计数器 1.当前线程所执行的字节码的行号指示器. 2.唯一不会发生OutOfMemoryError的区域 3.如果执行的是java方法,计数器值为虚拟机字节码 ...

  5. 笔记:Java虚拟机运行时数据区

    Java虚拟机在执行Java程序的过程中会把它管的内存划分为以下若干个不同的区域: 1.程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器:由于Java虚拟机的 ...

  6. 【JVM从小白学成大佬】2.Java虚拟机运行时数据区

    目录 1.运行时数据区介绍 2.堆(Heap) 是否可能有两个对象共用一段内存的事故? 3.方法区(Method Area) 4.程序计数器(Program Counter Register) 5.虚 ...

  7. 【JVM学习】2.Java虚拟机运行时数据区

    来源: 公众号: 猿人谷 这里我们先说句题外话,相信大家在面试中经常被问到介绍Java内存模型,我在面试别人时也会经常问这个问题.但是,往往都会令我比较尴尬,我还话音未落,面试者就会"背诵& ...

  8. Java 虚拟机运行时数据区详解

    本文摘自深入理解 Java 虚拟机第三版 概述 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟 ...

  9. 深入理解Java虚拟机&运行时数据区

      其中,程序计数器.虚拟机栈.本地方法栈3个区域随线程而生,随线程而灭.

随机推荐

  1. [bzoj 1270][BeijingWc2008]雷涛的小猫

    Description 雷涛的小猫雷涛同学非常的有爱心,在他的宿舍里,养着一只因为受伤被救助的小猫(当然,这样的行为是违反学 生宿舍管理条例的).  在他的照顾下,小猫很快恢复了健康,并且愈发的活泼可 ...

  2. java自学入门心得体会 0.1

    之前记录了java的简介和基本语法 这里记载下对象和类 不太懂的我理解java对象和类的概念很模糊,因为有了 Abstract修饰符 让对象与类更加的扑朔迷离 - - 所以,就像很开放的语言,创建对象 ...

  3. 常用字符与ASCII代码对照表

    常用字符与ASCII代码对照表 为了便于查询,以下列出ASCII码表:第128-255号为扩展字符(不常用) ASCII码 键盘 ASCII 码 键盘 ASCII 码 键盘 ASCII 码 键盘 27 ...

  4. UVa 11212 编辑书稿(dfs+IDA*)

    https://vjudge.net/problem/UVA-11212 题意:给出n个自然段组成的文章,将他们排列成1,2...,n.每次只能剪切一段连续的自然段,粘贴时按照顺序粘贴. 思路:状态空 ...

  5. stack_01

    A.添加/移除 A.1.void stack::push(elemValue); // 栈头 添加元素 A.2.void stack::pop(); // 栈头 移除第一个元素 B.随机存取 C.数据 ...

  6. [ios]cocos2dx获取设备的当前预言

    参考:http://blog.sina.com.cn/s/blog_923fdd9b0101fmpv.html http://bbs.9ria.com/thread-199313-1-1.html / ...

  7. 探秘AOP实现原理

    可以这么说,AOP是基于动态代理实现的. 那么,这个过程是怎样的? 首先,我们有这样的一个Service类,它是被作为切面的一个类: public class Service implements U ...

  8. windows 启用ipv6(for XX-net)补充“Ping请求找不到主机”问题

    ipv6.google.com 有点地方直接能启用,有的时候不行. 导致在xx - net 里无法启用ipv6 这样搞试试 netsh int ipv6 isatap set state enable ...

  9. Python mysql-表中数据的大量插入

    2017-09-06 23:28:26 import pymysql db = pymysql.connect("localhost","root"," ...

  10. Fair CodeForces - 987D (bfs)

    链接 大意:给定无向图边权均为1, 每个节点有一种货物, 对于每个节点, 求出拿到$s$种不同货物的最短距离 (每种货物独立计算,并且不用返回) 因为$s$较小, 直接枚举每种货物即可 所以问题就转化 ...