运行时数据区

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. swift设计模式学习 - 策略模式

    移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 策略模式 策略模式定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. ...

  2. HDU 2242 考研路茫茫——空调教室(边双连通分量+树形dp+重边标号)

    http://acm.hdu.edu.cn/showproblem.php?pid=2242 题意: 思路:首先求一下双连通分量,如果只有一个双连通分量,那么无论断哪根管子,图还是连通的. 最后只需要 ...

  3. Linux——进程管理学习简单笔记

    基本概念: 进程和程序的区别 : 1.程序是静态概念,本身作为一种软件资源长期保存:而进程是程序的执行过程,它是动态概念,有一定的生命期,是动态产生和消亡的. 2.程序和进程无一一对应关系.一个程序可 ...

  4. 正则表达式提取HTML中img标签的src地址

    一般来说一个 HTML 文档有很多标签,比如“”.“”.“”等, 想把文档中的 img 标签提取出来并不是一件容易的事. 由于 img 标签样式变化多端,使提取的时候用程序寻找并不容易. 于是想要寻找 ...

  5. Python day12部分内置函数的常见方法

    #内置函数 print(abs(-1))#绝对值 ']))#判断list的真假,都真则真,有一个假也是假 print(any(''))#有一个真就真,全假则假 print(bin(3))#十进制转换二 ...

  6. Qt5.3.2(VS2010)_调试_查看变量值

    1.菜单栏 -->控件(W) --> 视图 2.在"Debug"状态下,选择一个变量(或者 按住左键 选择变量及其属性/方法)--> 右键 --> 添加表达 ...

  7. 【Golang 接口自动化00】为什么要用Golang做自动化?

    为什么使用Golang做自动化 顺应公司的趋势学习了Golang之后,因为没有开发那么多的时间和项目来实践,怕步此前学习Java缺少练习遗忘殆尽的后尘,决定利用工作之余的时间把此前用Python的写的 ...

  8. Codeforces 580A - Kefa and First Steps

    580A - Kefa and First Steps 思路:dp dp[i]表示包括前i个元素中a[i]在内的最大增序列. 代码: #include<bits/stdc++.h> usi ...

  9. elementUI和iview兼容么

    听说iview的作者居然是91年的,我要赶快加油了. https://zhuanlan.zhihu.com/p/25739512

  10. 『PyTorch』第十弹_循环神经网络

    RNN基础: 『cs231n』作业3问题1选讲_通过代码理解RNN&图像标注训练 TensorFlow RNN: 『TensotFlow』基础RNN网络分类问题 『TensotFlow』基础R ...