jvm虚拟机中运行时数据区域介绍

简介: jvm虚拟机中,运行时数据区域包括七大部分 i. 程序计算器 i. 定义 1) 极小的内存空间; 2) 行号指示器,程序的分支、循环、跳转、异常处理、线程恢复等基本功能都需要依赖程序计算器; 3) 线程私有的。
   jvm虚拟机中,运行时数据区域包括七大部分

_

    i.  程序计算器
        i. 定义
            1) 极小的内存空间;
            2) 行号指示器,程序的分支、循环、跳转、异常处理、线程恢复等基本功能都需要依赖程序计算器;
            3) 线程私有的。
        ii. 由来
            因为java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在一个确定的时刻,一个cpu只执行一条线程中的指令;为了线程切换后能
        恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,此内存为线程私有。
            
        iii. 不同的使用场景
            1) 线程执行的是java方法,计数器记录的是正在执行的虚拟机字节码指令的地址;
            2) Native方法,计数器值为空;
        iv. 注意
            在java虚拟机规范中唯一没有规定任何OutOfMemoryError情况的区域
    ii.  java虚拟机栈
        i. 定义
            1) 线程私有的,生命周期与线程相同;
            2) 虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息;
            3) 方法的调用直至执行完成的过程,对应着栈帧在虚拟机栈中入栈到出栈的过程。
        ii. 虚拟机栈主要的部分是局部变量表
            1) 存放了编译器可知的各种基本数据类型(boolean,byte,char,short,int,float,long,double-8 种)、对象引用和returnAddress类型(指向了一条字节码指令的地址);
            2) 局部变量表所需的内存空间在编译期间完成分配,在方法运行期间不会改变局部变量表的大小;
            3) 64位的long和double类型的数据占据2个局部变量空间。
        iii. 两种异常
            1) 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;
            2) 如果虚拟机可以动态扩展,如果扩展时无法申请到足够的内存,将会抛出OutOfMemoryErro异常。
    iii. 本地方法栈
            1) 与虚拟机栈作用类似,本地方法栈是虚拟机栈使用到的Native方法服务;
            2) 在虚拟机规范中对本地方法栈中方法使用的语言、使用方式与数据结构没有强制规定,具体的虚拟机可以自由实现;
            3) Sun HotSpot虚拟机把本地方法栈和虚拟机栈结合;
            4) 本地方法栈也会报虚拟机栈的两种异常。
    iv. java堆
        i. 定义
            1) java虚拟机管理的最大的一块内存;
            2) 所有线程共享的内存区域;
            3) 目的:存放对象实例,几乎所有的对象实例都在这里分配内存;(所有的对象实例以及数组都要在堆上分配)
            4)  特别注意的是: 随着JIT编译器的发展与逃逸分析技术的成熟,栈上分配、标量替换优化技术带来了变化。
        ii.  垃圾收集器
            1) 垃圾收集的主要区域,也称为“GC堆”;
            2) 从内存回收的角度:基本采用分代收集算法,一:java堆分为新生代和老年代;二:Eden空间、From Survivor空间、To Survivor空间等;
            3) 从内存分配的角度:线程共享的java堆中可能划分出多个线程私有的分配缓冲区。目的是为了更好地、更快地回收内存;
        iii. 物理内存的划分
            1) java虚拟机规范规定,java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可;
            2) 实现时,即可是固定大小的,也可是可扩展的;当前主流的虚拟机都是可扩展的,通过-Xmx和-Xms控制;
            3) 如果堆中没有内存,并且堆也无法扩展 ,抛出OutOfMemoryError异常。
    v. 方法区
        i. 定义
            1) 所有线程共享的内存区域;
            2) 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
        ii. 方法区等于永久代?
            1) 在HostSpot虚拟机中, 使用永久代来实现方法区,这样的话垃圾收集器可以像管理Java堆一样管理这部分内存;
            2) 原则上,如何实现方法区属于虚拟机实现细节,不受虚拟机规范约束,使用永久代来是实现方法区是不合理的;因为容易出现内存溢出的问题;
            3) Jdk1.7中,永久代中的字符串常量池中移出。
        iii. 垃圾收集
            1) 方法区和java堆一样不需要连续的内存和可以选择固定大小或者可扩展外,还可以选择不实现垃圾收集;
            2) 垃圾收集行为在方法区较少出现,方法区的内存回收目标主要是针对常量池的回收和对类型的卸载;(回收效果差,类型卸载要求高)
            3) 回收非常有必要,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。
    vi. 运行时常量池
        i. 定义
            1) 方法区的一部分;
            2) 存放的是: 类加载后class文件中常量池的信息;
            3) Class文件包括: 1 常量池  2  类的基本描述信息(字段、方法、接口)
        ii. 运行时常量池和Class文件中的常量池
            1) 运行时常量池,细节要求不高,可以根据不同的需求来实现该内存区域;
            2) Class包括其中的常量池,格式要求严格,具体到每一个字节存储的数据都必须符合才能被虚拟机认可、装载和执行;
            3) 运行时常量池,不仅保存Class文件中描述的符号引用,而且也保存翻译的直接引用。
        iii. 动态性
            1) java语言并不要求常量一定只有编译器才能产生,也就是说不是只有提前放置在Class文件常量池中的内容才能进入方法区的运行时常量池;
            2) 在运行期也可以将新的常量放入运行时常量池,比如String的intern()方法、
            3) 常量池可能报OutOfMemoryError异常。
    vii. 直接内存
        i. 定义
            1) Nio类,一种基于通道与缓存区的I/o方式,可以使用Native函数库直接分配堆外内存,通过存储在java堆中的DirectByteBuffer对象作为这块内存的引用;
            2) Nio的使用在某些场合避免了在java堆和Native堆中来回复制数据,提高了性能;
            3) 直接内存不受java堆大小的控制,但是受到本机总内存大小以及处理器寻址空间的限制;
            4) 也是会报OutOfMemoryError异常。
       参考: java虚拟机第二版
相关文章
|
4天前
|
存储 Java C++
Java虚拟机(JVM)在执行Java程序时,会将其管理的内存划分为几个不同的区域
【6月更文挑战第24天】Java JVM管理内存分7区:程序计数器记录线程执行位置;虚拟机栈处理方法调用,每个线程有独立栈;本地方法栈服务native方法;Java堆存储所有对象实例,垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息;运行时常量池存储常量;直接内存不属于JVM规范,通过`java.nio`手动管理,不受GC直接影响。
16 5
|
4天前
|
存储 Java C++
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据,如局部变量和操作数;本地方法栈支持native方法;堆存放所有线程的对象实例,由垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息和常量;运行时常量池是方法区一部分,保存符号引用和常量;直接内存非JVM规范定义,手动管理,通过Buffer类使用。Java 8后,永久代被元空间取代,G1成为默认GC。
11 2
|
8天前
|
监控 算法 Java
Java虚拟机(JVM)使用多种垃圾回收算法来管理内存,以确保程序运行时不会因为内存不足而崩溃。
【6月更文挑战第20天】Java JVM运用多种GC算法,如标记-清除、复制、标记-压缩、分代收集、增量收集、并行收集和并发标记,以自动化内存管理,防止因内存耗尽导致的程序崩溃。这些算法各有优劣,适应不同的性能和资源需求。垃圾回收旨在避免手动内存管理,简化编程。当遇到内存泄漏,可以借助VisualVM、JConsole或MAT等工具监测内存、生成堆转储,分析引用链并定位泄漏源,从而解决问题。
20 4
|
6天前
|
存储 监控 Java
JVM:Java虚拟机探秘
JVM:Java虚拟机探秘
8 1
|
10天前
|
算法 Java
Java垃圾回收(Garbage Collection,GC)是Java虚拟机(JVM)的一种自动内存管理机制,用于在运行时自动回收不再使用的对象所占的内存空间
【6月更文挑战第18天】Java的GC自动回收内存,包括标记清除(产生碎片)、复制(效率低)、标记整理(兼顾连续性与效率)和分代收集(区分新生代和老年代,用不同算法优化)等策略。现代JVM通常采用分代收集,以平衡性能和内存利用率。
36 3
|
1天前
|
存储 安全 Java
深入理解Java内存模型(JMM)与虚拟机的内存结构(JVM)
深入理解Java内存模型(JMM)与虚拟机的内存结构(JVM)
5 0
|
7天前
|
算法 Java 程序员
JVM虚拟机的故事
JVM虚拟机的故事
5 0
|
2天前
|
存储 Java 对象存储
jvm内存模型剖析
当线程cpu时间片执行完后,线程进入休眠状态,当再次唤醒时,通过程序计数器确定指令执行到哪一行,然后继续往下执行。
12 1
|
15天前
|
算法 安全 Java
JVM系列4-垃圾收集器与内存分配策略(二)
JVM系列4-垃圾收集器与内存分配策略(二)
20 0
JVM系列4-垃圾收集器与内存分配策略(二)
|
18小时前
|
存储 缓存 算法
详解JVM内存优化技术:压缩指针
详解JVM内存优化技术:压缩指针
7 0