JAVA虚拟机运行时数据区域

1.程序计数器

 1)它可以看做是当前线程执行的字节代码的行指示器,通过改变计数器的值来决定下一步执行的代码

  2)它是线程私有的,每个线程都有自己的程序计数器(JAVA中多线程是通过线程轮流切换、分配处理器的执行时间的方式实现的)

  3)它的生命周期和线程的生命周期一致

 3)对于JVM 来说,程序就是存储在方法区的字节码指令。如果执行的是JAVA方法,程序计数器记录的是正在执行的虚拟机字节码指令的地址,如果是native方法,计数器为空(Underfiend)

  4)储蓄计数器内JAVA虚拟机内存区域中在<<JAVA虚拟机规范>>中规定任何OutOfMemoryError的内存区域

2.JAVA虚拟机栈

 1)每个方法被执行的时候,都会创建一个栈帧,用于存储局部变量表、操作数栈、动态连接、方法出口等信息(https://www.cnblogs.com/jthr/p/15762205.html)。每一个方法从调用到执行结束的过程就对应着栈帧在虚拟机栈中入栈到出栈的过程

  2)它是线程私有的

  3)它的生命周期和线程的生命周期一致

  4)局部变量表

     存放了编译器的可知的各种JAVA虚拟机基本数据类型、对象引用(reference类型,它不等同与对象本身,可能是指向对象起始地址的引用指针或者指向对象的句柄或者其它的与此对象相关的位置[https://www.cnblogs.com/jthr/p/15484760.html 第三块内容])、returnAddress类型(对于 JVM 来说,程序就是存储在方法区的字节码指令,而 returnAddress 类型的值就是指向特定指令内存地址的指针。程序计数器的值就是当前指令所在的内存地址,即 returnAddress 类型的数据(java方法))

     这些数据类型在局部变量表中的存储空间以局部变量槽来表示

     局部变量表的空间在编译完成分配(一个方法需要在栈帧中分配多大的空间是确定的),在运行期间不会改变局部变量表的大小。这个大小指的是变量槽的数量。至于1个变量槽是占用32个比特、64个比特或者其它,看虚拟机的具体实现

  5)虚拟机栈的容量可以动态扩充

  6)<<JAVA虚拟机规范>>规定了两种异常。

    StandOverfolwError:线程请求的栈的深度大于虚拟机栈的深度。也就是栈帧太多,入不了栈了。

    OutOfMemeryError:JAVA虚拟机扩展时无法申请到足够的内存

3.本地方法栈

  本地方法栈和虚拟机内存栈基本类似。区别是虚拟机内存栈执行的是JAVA方法,本地方法栈执行的是native方法。

   有的虚拟机(HotSpot)把两者合二为一

4.JAVA堆

 1)它的唯一目的就是存放对象实例,它是JAVA虚拟机管理的内存中最大的一块

 2)它是所有线程共享的,当然,也可以在里面分配出各个线程私有的区域,如本地线程分配换缓冲区TLAB(https://www.cnblogs.com/jthr/p/15484760.html中1.2.2.2)

 3)它在虚拟机启动时创建

 4)它是垃圾回收器主要管理的内存区域

 5)JAVA堆可以处于物理上不连续的内存空间,但在逻辑上是连续的

 6)它的大小可以是固定的也可以是可扩展的,主流的虚拟机都是设计的可扩展的

 7)但JAVA堆没有内存分配实例且堆无法扩展时,会报出OutOfMemoryError

5.方法区

 1)它用于存储被虚拟机加载的类信息(类的版本、字段、方法、接口等)。常量、静态变量、即时编译器编译后的代码缓存等数据。(关于class文件信息https://www.cnblogs.com/jthr/p/15621161.html)

  2)它是线程共享的

  3)它可以处于物理上不连续的内存空间,但在逻辑上是连续的

  4)它的大小可以是固定的也可以是可扩展的,主流的虚拟机都是设计的可扩展的

5)它可以选择不实现垃圾收集。但是一般会进行回收,这个区域的回收目标主要是针对常量池的回收和类型的卸载。

  6)它的内存空间无法满足分配需求且无法扩展时,会报出OutOfMemoryError

6.运行时常量池

  1)在JDK1.7之前运行时常量池逻辑包含字符串常量池,存放在方法区。

  2)在JDK1.7字符串常量池被从方法区拿到了堆中, ,运行时常量池还在方法区,。

  3)在JDK1.8 hotspot移除了永久代用元空间(Metaspace)取而代之, 这时候字符串常量池在堆, 运行时常量池还在方法区, 只不过方法区的实现从永久代变成了元空间(Metaspace)

6.1字符串常量池

1)字符串常量池的数据结构
  在HotSpot VM里实现的string pool功能的是一个StringTable类,它是一个Hash表,默认值大小长度是1009;StringTable在每个HotSpot VM的实例只有一份被所有的类共享。字符串常量由一个一个字符组成,放在了StringTable上。
  在JDK6.0中,StringTable的长度是固定的,长度就是1009,因此如果放入String Pool中的String非常多,就会造成hash冲突,导致链表过长,当调用String#intern()时会需要到链表上一个一个找,从而导致性能大幅度下降;

  在JDK7.0中,StringTable的长度可以通过参数指定:-XX:StringTableSize=66666

2)字符串常量池里存放的内容

  在JDK6.0及之前版本中,String Pool里放的都是字符串常量;

  在JDK7.0中,由于String#intern()发生了改变,除了字符串常量,String Pool中也可以存放放于堆内的字符串对象的引用

6.2class常量池(Class Constant Pool静态常量池)

1)简介
  我们写的每一个Java类被编译后,就会形成一份class文件;class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池表(constant pool table),用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References);每个class文件都有一个class常量池

2)字面量和符号引用
  https://www.cnblogs.com/jthr/p/15484424.html

3)静态常量池其实就是class文件里的一部分内容

  以下图片是编译后的class文件。

当类加载到内存中后,jvm就会将静态常量池中的内容存放到运行时常量池中

6.3运行时常量池

  运行时常量池存在于内存中,也就是静态常量池被加载到内存之后的版本,不同之处是:它的字面量可以动态的添加(String#intern()),符号引用可以被解析为直接引用
  JVM在执行某个类的时候,必须经过加载、连接、初始化,而连接又包括验证、准备、解析三个阶段。而当类加载到内存中后,jvm就会将静态常量池中的内容存放到运行时常量池中

  运行时常量池是全局共享的,多个类共用一个运行时常量池。并且class文件中常量池多个相同的字符串在运行时常量池只会存在一份

  关系小结:

    编译好的class文件包含了Constant pool(静态常量池)

    class文件被加载时,Constant pool的内容会被加载到运行时常量池

    运行时处理池也就包含了类的一些信息(字面量、符号引用等等信息)

    在jdk1.7以前,运行时常量池包括字符串常量池,不过1.7开始字符串处理池从运行时处理池移到堆了

JAVA虚拟机02---JAVA虚拟机运行时数据区域简介的更多相关文章

  1. Java虚拟机 - 结构原理与运行时数据区域

    http://liuwangshu.cn/java/jvm/1-runtime-data-area.html 前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关 ...

  2. Java虚拟机-运行时数据区域

    Java虚拟机管理的内存包括如图所示的运行时数据区域: 下面分别进行介绍: 1)程序计数器(Program Counter Register) 占用的内存空间比较小,主要作用就是标识当前线程执行的字节 ...

  3. 深入理解JAVA虚拟机之JVM性能篇---基础知识点(运行时数据区域)

    一. 运行数据区域划分 各个数据区域功能如下: 1. 程序计数器: 较小的一块内存空间,可以看做是当前线程所执行的字节码的行号指示器,每条线程都有一个独立的程序计数器,各条线程之间计数器互不影响,独立 ...

  4. Java虚拟机一:运行时数据区域

    java虚拟机在执行java程序的过程中,会把内存划分为若干个不同的数据区域.每个区域都有各自的用途,创建和销毁时间,按照<java虚拟机规范(Java SE 7 版)>的规定,虚拟机运行 ...

  5. [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义

    前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine  ,既然是虚拟机, ...

  6. Java虚拟机(一)结构原理与运行时数据区域

    我们来学习Java虚拟机的结构原理与运行时数据区域. 1.Java虚拟机概述 Oracle官方定义的Java技术体系主要包括以下几个部分: Java程序设计语言 各种平台的Java虚拟机 Class文 ...

  7. 深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域

    深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理 ...

  8. 《深入理解java虚拟机》笔记(1)运行时数据区域

    1.Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来. 2.运行时数据区域划分 java虚拟机在执行java程序的过程中会把它所管理的内存划 ...

  9. 关于Java虚拟机运行时数据区域的总结

    Java虚拟机运行时数据区域 程序计数器(Program Counter) 程序计数器作为一个概念模型,这个是用来指示下一条需要执行的字节码指令在哪. Java的多线程实际上是通过线程轮转做到的,如果 ...

  10. JVM学习(一)Java虚拟机运行时数据区域

    一.Java内存区域 1.运行时数据区域 根据<Java 虚拟机规范(Java SE 7 版)>规定,Java 虚拟机所管理的内存包括以下几个运行时数据区域: 1.1 程序计数器 程序计数 ...

随机推荐

  1. 【笔记】CF1607F Robot on the Board 2 及相关

    题目传送门 记忆化搜索 首先,这题 \(10000\) 组 \(2000\times 2000\) 的数据直接爆搜肯定会超时.想到,如果一个点的答案已经被更新过,之后走到这个点能再多走的点也就确定了, ...

  2. RocketMQ 在同程旅行的落地实践

    本文作者:刘树东 - 同程艺龙技术专家 01/使用概况 同程旅行选择RocketMQ主要基于以下几个方面的考虑: 技术栈:公司主要以 Java 开发为主,因此我们倾向于选择一款用 Java 实现的MQ ...

  3. PHP 代码解一元二次方程

    1 function php_getSolutionOVQE($a,$b,$c=0){ 2 $x1=0; 3 $x2=0; 4 $detal=0; 5 if($a==0 && $b== ...

  4. 基于python的数学建模---二维插值的三维图

    import numpy as np from mpl_toolkits.mplot3d import Axes3D import matplotlib as mpl from scipy impor ...

  5. ElasticSearch7.6.1学习笔记-狂神

    ElasticSearch:7.6.1 https://gitee.com/yujie.louis/elastic-search 笔记,代码,安装包等 什么是ElasticSearch? Elasti ...

  6. python将列表中的数字合并成一个数字

    前言 今天,写算法题,其中需要进行这一步操作 输入: [1,2,3,4,5] 输出: 12345 解决办法 我首先想到用 join() 函数,但我发现使用join函数要求列表中的元素都是字符串,所以需 ...

  7. java面试题-常用框架

    Spring Spring 是什么 一个开发框架,一个容器,主要由面向切面AOP 和依赖注入DI两个方面,外加一些工具 AOP和IOC AOP 面向切面 AOP是一种编程思想,主要是逻辑分离, 使业务 ...

  8. 【Spark】Day02:Spark-Core:RDD概述、RDD编程(转换算子、Action)、序列化、依赖关系、持久化、数据读取保存、累加器、广播变量、top10、转化率

    总结:https://www.cnblogs.com/qingyunzong/p/8899715.html 一.RDD概述 1.引入:IO流 按行.按字节.字节缓冲 调用read方法读取流,均为惰性加 ...

  9. 定制.NET 6.0的Middleware中间件

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 在本文中,我们将学习中间件,以及如何使用它进一步定制应用程序.我们将快速学习中间件 ...

  10. java线程基础知识整理

    目录 线程基本概念 1.java实现线程 2.线程的生命周期 3.线程常用的方法 3.1.sleep() 3.2.interrupt方法 3.3.stop方法 4.线程调度 4.1.常见的线程调度模型 ...