zoukankan      html  css  js  c++  java
  • 理解JVM模型

    概括

    JVM运行时数据区可以划分为5部分,分别是:程序计数器、虚拟机栈、本地方法栈、堆、方法区

    程序计数器(Program Counter Register)

    相当于当前线程所执行字节码的行号指示器。
    程序计数器是线程隔离的。
    程序计数器区域是以上五个区域中唯一一个不会报OutOfMemoryError的区域。

    虚拟机栈(VM Stack)

    每个方法在执行时都会创建一个栈桢(存放局部变量表,操作数栈等),每个方法的嗲欧勇和执行完成,就代表着栈桢在虚拟机栈中入栈和出栈的过程。简单地说,虚拟机栈就是为JVM执行java方法(字节码)的区域。
    虚拟机栈是线程隔离的。
    当线程请求的栈深度大于虚拟机栈的深度时,StackOverFlowError。
    当虚拟机栈需要扩展且无法申请到足够内存时,OutOfMemoryError。

    本地方法栈(Native Method Stack)

    类似于虚拟机栈的解释,简单说本地方法栈就是为JVM提供Native方法服务。
    Native方法:java程序调用非java语言实现的接口,比如底层的一些驱动硬件的接口,以C语言实现。

    堆(Heap)

    存放实例对象以及数组,可划分为Eden,From Survivor,To Survivor。在物理内容上可以是不连续的,堆是可扩展的(-xmm,-xms参数),当堆中无空间来为实例对象分配内存且堆无法扩展空间时,OutOfMemoryError。

    方法区(Method Area)

    存储JVM的类加载信息、常量、静态变量等,又称为Non-Heap,常量池也为方法区的一部分。


    附上一张HotSpot模型图

  • 相关阅读:
    Nginx--sub_filter模块
    Scala学习5 objext
    Scala学习4 Class
    Scala学习3 Map
    Scala学习2 Array、ArrayBuffer
    Scala学习1 基本数据类型,条件,循环
    flink1.9新特性:维表Join解读
    Blink源码编译
    Flink Maven项目兼容多版本Kafka
    Ant build.xml程序简单说明
  • 原文地址:https://www.cnblogs.com/guodongdidi/p/10073163.html
Copyright © 2011-2022 走看看