JVM内存布局你知道多少

JVM 学习之旅

  • 前言
  • JVM运行时数据区
    • 堆(Heap)
    • 方法区(Method Area)
    • Java虚拟机栈 (Java Virtual Machine Stacks)
    • 本地方法栈(Native Method Stack)
    • 程序计数器(Program Counter Register)

前言

     JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

JVM运行时数据区

Jvm运行时数据区如下图:
JVM内存布局你知道多少_第1张图片

堆(Heap)

The Java Virtual Machine has a heap that is shared among all Java Virtual  Machine threads. 
The heap is the run-time data area from which memory for all class instances and 
arrays is allocated.The heap is created on virtual machine start-up.

Java堆是Java虚拟机所管理内存中最大的一块,在虚拟机启动时创建,被所有线程共享。
Java对象实例以及数组都在堆上分配。

方法区(Method Area)

The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads.
The method area is created on virtual machine start-up. Although the method area is logically part of 
the heap, ......If memory in the method area cannot be made available to satisfy an allocation request, 
the Java Virtual Machine throws an  OutOfMemoryError.

    方法区是各个线程共享的内存区域,在虚拟机启动时创建。
用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却又一个别名叫做Non-Heap(非堆),目
的是与Java堆区分开来。
当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。

Java虚拟机栈 (Java Virtual Machine Stacks)

虚拟机栈是一个线程执行的区域,保存着一个线程中方法的调用状态。换句话说,一个Java线程的运行状态,由一个虚拟机栈来保存,所以虚拟机栈肯定是线程私有的,独有的,随着线程的创建而创建。
每一个被线程执行的方法,为该栈中的栈帧,即每个方法对应一个栈帧。
调用一个方法,就会向栈中压入一个栈帧;一个方法调用完成,就会把该栈帧从栈中弹出。
一个栈帧包括
JVM内存布局你知道多少_第2张图片
局部变量表:方法中定义的局部变量以及方法的参数存放在这张表中局部变量表中的变量不可直接使用,如需要使用的话,必须通过相关指令将其加载至操作数栈中作为操作数使用。

操作数栈:以压栈和出栈的方式存储操作数的

动态链接:每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接(Dynamic Linking)。

方法出口:当一个方法开始执行后,只有两种方式可以退出,一种是遇到方法返回的字节码指令;一种是遇见异常,并且这个异常没有在方法体内得到处理。

本地方法栈(Native Method Stack)

如果当前线程执行的方法是Native类型的,这些方法就会在本地方法栈中执行。

程序计数器(Program Counter Register)

   The Java Virtual Machine can support many threads of execution at once (JLS§17). Each Java Virtual 
   Machine thread has its own pc (program counter) register. At any point, each Java Virtual Machine 
   thread is executing the code of a single method, namely the current method (§2.6) for that thread. 
   If that method is not native, the pc register contains the address of the Java Virtual Machine 
   instruction currently being executed.If the method currently being executed by the thread is native,
   the value of the Java Virtual Machine's pc register is undefined. The Java Virtual Machine's 
   pc register is wide enough to hold a returnAddress or a native  pointer on the specific platform.

程序计数器占用的内存空间很小,由于Java虚拟机的多线程是通过线程轮流切换,并分配处理器执行时
间的方式来实现的,在任意时刻,一个处理器只会执行一条线程中的指令。因此,为了线程切换后能够
恢复到正确的执行位置,每条线程需要有一个独立的程序计数器(线程私有)。
如果线程正在执行Java方法,则计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,则这个计数器为空。

你可能感兴趣的:(JVM,java,jvm)