`

jvm运行时数据区

    博客分类:
  • jvm
jvm 
阅读更多
Runtime data area 主要包括五个部分:Heap (堆), Method Area(方法区域),Java Stack(java 的栈), Program Counter(程序计数器), Native method stack(本地方法栈)。Heap 和Method Area 是被所有线程的共享使用的;而Java stack, Program counter 和Native method stack 是以线程为粒度的,每个线程独自拥有。

Heap
Java 程序在运行时创建的所有类实或数组都放在同一个堆中。而一个Java 虚拟实例中只存在一个堆空间,因此所有线程都将共享这个堆。每一个java 程序独占一个JVM 实例,因而每个java 程序都有它自己的堆空间,它们不会彼此干扰。但是同一java 程序的多个线程都共享着同一个堆空间,就得考虑多线程访问对象(堆数据)的同步问题。(这里可能出现的异常java.lang.OutOfMemoryError:
Java heap space)

Method area
在Java 虚拟机中,被装载的class 的信息存储在Method area 的内存中。当虚拟机装载某个类型时,它使用类装载器定位相应的class 文件,然后读入这个class 文件内容并把它传输到虚拟机中。紧接着虚拟机提取其中的类型信息,并将这些信息存储到方法区。该类型中的类(静态)变量同样也存储在方法区中。与Heap 一样,method area 是多线程共享的,因此要考虑多线程访问的同步问题。比如,假设同时两个线程都企图访问一个名为Lava 的类,而这个类还没有内装载入虚拟机,那么,这时应该只有一个线程去装载它,而另一个线程则只能等待。(这里可能出现的异常java.lang.OutOfMemoryError: PermGen full)

Java stack
Java stack 以帧为单位保存线程的运行状态。虚拟机只会直接对Java stack 执行两种操作:以帧为单位的压栈或出栈。每当线程调用一个方法的时候,就对当前状态作为一个帧保存到java stack 中(压栈);当一个方法调用返回时,从java stack 弹出一个帧(出栈)。栈的大小是有一定的限制,这个可能出现StackOverFlow 问题。下面的程序可以说明这个问题。
public class TestStackOverFlow {
public static void main(String[] args) {
Recursive r = new Recursive();
r.doit(10000);
// Exception in thread "main"
java.lang.StackOverflowError
}
}
class Recursive {
public int doit(int t) {
if (t <= 1) {
return 1;
}
return t + doit(t - 1);
}
}

Program counter
每个运行中的Java 程序,每一个线程都有它自己的PC 寄存器,也是该线程启动时创建的。PC 寄存器的内容总是指向下一条将被执行指令的内存地址,这里的内存地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。

Native method stack
对于一个运行中的Java 程序而言,它还能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,不止与此,它还可以做任何它想做的事情。比如,可以调用寄存器,或在操作系统中分配内存等。总之,本地方法具有和JVM 相同的能力和权限。(这里出现JVM 无法控制的内存溢出问题native heap OutOfMemory )

分享到:
评论

相关推荐

    第3节: 揭秘JVM运行时数据区-02

    第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行...

    JVM运行时数据区

    ### JVM运行时数据区详解 #### 一、概述 Java虚拟机(JVM)作为Java程序的运行环境,定义了一系列用于程序执行过程中使用的数据区域。这些数据区域在JVM启动时创建,在JVM退出时销毁。其中一些数据区域是线程独立...

    Java内存模型与JVM运行时数据区的区别详解

    Java内存模型与JVM运行时数据区的区别详解 Java内存模型是Java语言在多线程并发情况下对于共享变量读写的规范,主要是为了解决多线程可见性、原子性的问题,解决共享变量的多线程操作冲突问题。Java内存模型是为了...

    JVM运行时数据区原理解析

    JVM运行时数据区原理解析 JVM运行时数据区是Java虚拟机中最重要的组成部分之一,它是JVM运行时的核心区域,负责存储和管理程序运行时需要的数据。根据JVM规范,JVM运行时数据区可以分为五个部分:PC寄存器、虚拟机...

    JVM运行时数据区划分原理详解

    "JVM运行时数据区划分原理详解" JVM运行时数据区划分原理详解是Java虚拟机(JVM)的核心组件之一,负责管理Java应用程序的内存资源。该原理详解了JVM如何划分和管理内存空间,以便更好地支持Java应用程序的运行。 ...

    超硬核!!!一篇文章搞定整个JVM运行时数据区

    首先,我们来看JVM运行时数据区的组成部分: 1. **方法区(Method Area)**:这是一个全局共享的内存区域,存储了类信息、常量、静态变量以及编译后的代码。这部分内存被称为Non-Heap,当其内存不足时,会抛出`...

    全面了解JVM组成底层工作原理以及数据结构

    此外,直接内存不属于JVM运行时数据区的一部分,但被频繁使用,如在Java NIO中用于基于Channel与Buffer的IO操作。 3. JVM执行引擎与垃圾回收: JVM的执行引擎负责解释字节码指令,它通常包括即时编译器和解释器两种...

    03 运行时数据区概述及线程.pptx

    03 JVM 运行时数据区概述及线程的 PPT 重绘。讲述 Java 虚拟机 运行时数据区所处位置,结构划分,以及各个区域与线程的关系。

    JVM 完整深入解析.pdf

    ### JVM运行时数据区 #### 程序计数器 程序计数器是当前线程所执行的字节码的行号指示器,是线程私有的内存区域。由于Java是多线程并发执行的,每个线程都需要有一个独立的程序计数器,以便记录线程切换后继续执行...

    Java虚拟机(JVM)面试题 51道.pdf

    5. **JVM运行时数据区详解**: - 程序计数器:每个线程都有自己的计数器,用于记录当前线程正在执行的字节码指令位置。 - 虚拟机栈:存储每个方法的局部变量表、操作数栈、动态链接和方法出口等信息,每个方法调用...

    JVM虚拟机复习宝典

    直接内存并不属于JVM运行时数据区的一部分,而是由JDK NIO库直接分配的堆外内存。这部分内存不受JVM堆大小的限制,但同样可能导致内存溢出。DirectByteBuffer对象作为直接内存的引用,用于操作这块内存。 #### 三、...

    jvm原理及调优

    #### 三、JVM运行时数据区详解 ##### 3.1 PC寄存器 PC寄存器(Program Counter Register)用于存储当前线程下一条指令的位置。对于执行native方法的线程,PC寄存器内容为空。 ##### 3.2 JVM栈 JVM栈是线程私有的...

    浅析JVM

    #### 二、JVM运行时数据区 JVM在运行时会划分多个内存区域来管理数据,主要包括以下几个部分: - **方法区**:存储类的信息(包括类的方法和字段)、常量、静态变量等。 - **堆区**:用于存放所有类实例和数组对象...

    面向对象和JVM内存模型.pdf

    6. 直接内存(Direct Memory):并非JVM运行时数据区的一部分,它通过NIO类库支持直接操作本地内存,并不是JVM规范所定义的。 JVM内存模型的设计是为了支持Java程序的动态特性,同时保证内存的安全和高效利用。JVM...

    JVM 32道面试题和答案.docx

    以下是对JVM运行时数据区及其相关知识点的详细说明: 1. **运行时数据区**: - **程序计数器**:每个线程都有自己的程序计数器,用于存储当前线程执行的字节码的行号,是唯一没有规定内存溢出情况的区域。 - **...

    Java虚拟机(JVM)面试题 51道

    5. **JVM运行时数据区详解**: - 程序计数器:记录当前线程执行的字节码指令位置,用于控制程序流程。 - 虚拟机栈:每个方法对应一个栈帧,存储局部变量表、操作数栈、动态链接和方法返回地址等信息。 - 本地方法...

    2024年java面试题-jvm之java虚拟机面试题

    #### JVM运行时数据区 **5. JVM运行时数据区详解** JVM管理的内存主要分为以下几部分: - **程序计数器(Program Counter Register)**:记录当前线程所执行的字节码指令的位置,确保线程恢复执行时可以从正确的...

    深入JVM内核—原理、诊断与优化视频教程

    #### 二、JVM运行时数据区 ##### 2.1 堆区 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。主要用于存放对象实例和数组。 - **新生代**:主要存放新创建的对象。 - **老年代**:经过多次GC后存活的对象会被...

Global site tag (gtag.js) - Google Analytics