`
chaijuntao
  • 浏览: 24774 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java 内存区域 详解

    博客分类:
  • JVM
 
阅读更多

Java虚拟机在执行Java程序的过程中会把它所管理的内存区域分为若干个不同的数据区域。这些区域都有各自的用途,有的区域随虚拟机进程启动而存在,有的区域则依赖用户线程启动和结束而建立和销毁。根据《Java虚拟机规范第二版》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域。

 

程序计数器

程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完成。

由于每个线程都有一个独立的程序计数器,以保证虚拟机在线程切换后能恢复到正确的执行位置(使用线程私有内存,各线程之间互不影响)。

如果线程当前执行的是JAVA代码,这个计数器记录的时正在执行虚拟机字节码指令的地址;如果是Native方法,这个计数器值则为空。此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

 

Java虚拟机栈

与程序计数器一样,也是线程私有的,生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口等信息。每个方法被调用直到执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

局部变量表存放了编译期可知的各种基本数据类型(boolean,byte,char,short,int,float,long,double),对象引用(reference),returnAddress(指向一条字节码指令的地址)。

long 和double类型的数据会占用2个局部变量空间(Slot) ,其他的数据类型只占一个。局部变量表所需内存在编程期间完成分配,当进入一个方法时,这个方法需要的帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

 

本地方法栈

本地方法栈与虚拟机栈非常相似。区别是:虚拟机栈为虚拟机执行Java代码(字节码)服务,而本地方法栈则是:虚拟机使用到的Native方法服务。

 

Java堆

Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域唯一目的就是存放对象实例,几乎所有对象实例以及数组都

在这里分配内存。(但随着JIT编译器的发展与逃逸分析技术的逐渐成熟,栈上分配,标量替换,优化技术将会导致一些微妙的变化,所有的对象都在堆上分配变得不是那么绝对了)

Java堆是垃圾收集管理的主要区域。Java堆可以细分为:新生代和老年代,在细致一点有:Eden空间,From Survivor空间,To Survivor空间等。如果从内存分配的角度看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer ,TLAB).

 

方法区(永久代)

方法区和Java堆一样,是个线程共享的内存区域,它用于存储虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。

 

运行时常量池

运行时常量池是方法区的一部分.Class 文件中除了由类的版本信息,字段,方法,接口等描述信息外,还有一项信息是 常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用

分享到:
评论

相关推荐

    Java内存模型详解

    ### Java内存模型详解 #### 1. JMM简介 ##### i. 内存模型概述 Java内存模型(Java Memory Model, JMM)是Java虚拟机(JVM)的一部分,用于规定程序中的各种变量(包括实例字段、静态字段和数组元素等)在多个...

    Java内存模型详解JMM.docx

    Java内存模型详解JMM Java内存模型(Java Memory Model,JMM)是Java虚拟机(JVM)中的一种内存模型,它描述了程序中各个变量之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节...

    JAVA内存溢出详解.doc

    Java内存主要分为堆内存(Heap)和栈内存(Stack),堆是存储对象实例的主要区域,而栈主要用于存储基本类型和对象引用。除此之外,还有方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native ...

    java内存分配详解

    #### 一、Java内存区域划分 Java程序在运行过程中涉及的内存主要分为两大类:栈内存和堆内存。 1. **栈内存**:主要用于存储局部变量,如基本数据类型变量(int、long、char等)以及对象的引用变量。这些变量在...

    java内存模型详解

    Java内存模型,简称JMM(Java Memory Model),是Java虚拟机规范中定义的一个抽象概念,它规定了程序中各个线程如何访问共享变量,以及对这些访问进行同步控制的规则。理解Java内存模型对于编写多线程并发程序至关...

    java内存模型详解--非常经典

    Java内存模型将内存划分为几个区域,主要包括堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(Program Counter Register)、本地方法栈(Native Method Stack)和虚拟机栈(Java Virtual Machine ...

    深入分析Java内存区域的使用详解

    Java内存区域的使用详解主要涵盖了五个核心部分:程序计数器、虚拟机栈、本地方法栈、Java堆以及方法区。这些区域各自负责不同的任务,共同确保Java应用程序的正常运行。 1. **程序计数器**:每个线程都有自己的...

    java内存分配机制详解

    ### Java内存分配机制详解 #### 一、引言 Java作为一种广泛应用的编程语言,其内存管理机制对于确保程序高效稳定运行至关重要。本文旨在详细介绍Java内存分配机制中的几个关键概念:寄存器、栈、堆、静态域、常量...

    Java中堆内存和栈内存详解

    ### Java中堆内存和栈内存详解 #### 一、引言 Java作为一种广泛使用的编程语言,其内存管理机制是...通过本文的学习,读者应该能够更深入地理解Java内存管理的基本概念,并能够根据实际需求选择合适的内存使用策略。

    java内存空间详解.doc

    Java 内存空间主要分为两个主要区域:栈内存(Stack)和堆内存(Heap)。栈内存主要用于存储基本类型变量(如 int、boolean)以及对象的引用。当在方法内部声明一个变量时,Java 会在栈内存中为其分配空间。一旦变量...

    深入Java核心 Java内存分配原理精讲编程资料

    #### 二、Java内存区域详解 Java程序在运行时会根据不同的需求划分为几个关键的内存区域,主要包括: 1. **寄存器**:这部分内存通常由硬件提供支持,用于快速访问当前线程的局部变量等信息。由于寄存器数量有限且...

    Java内存机制学习和使用

    每一个Java应用程序启动时都会创建一个独立的Java虚拟机(JVM)实例,每个JVM实例都会有自己的Java堆内存区域。 - **内存分配与回收**:当我们在代码中创建一个新的对象时,JVM会在堆内存中为其分配一块内存。当...

    java内存泄漏解决

    ### Java内存泄漏解决方案详解 #### 一、Java内存泄漏概述 在Java开发过程中,经常会遇到内存泄漏的问题,尤其是在长时间运行的应用程序中更为常见。本文将详细介绍如何解决Java内存泄漏问题,帮助开发者更好地...

    JAVA 内存设置原理

    ### JAVA内存设置原理详解 在深入探讨JAVA内存设置原理之前,我们先理解一下JVM(Java虚拟机)的内存管理机制。JVM是JAVA运行时环境的核心,它负责执行JAVA字节码,同时管理程序运行时的内存分配与回收。JVM的内存...

    Java内存分配原理精讲

    #### 二、Java内存区域概述 Java程序在运行时会根据不同的数据类型和生命周期将其分配到不同的内存区域。这些内存区域主要包括: 1. **寄存器**:用于临时存放CPU计算过程中产生的中间结果,这部分内存不由程序员...

    java堆内存详解.docx

    Java 堆内存是Java虚拟机管理的内存中最大的一块,它被所有线程共享,主要用来存放对象实例。在虚拟机启动时就会创建。Java堆的特点在于它的可扩展性,可以通过-Xmx和-Xms参数控制堆的初始容量和最大容量。如果堆...

    Java内存模Java内存模型

    【Java内存模型】详解 Java内存模型(JMM,Java Memory Model)是Java虚拟机(JVM)中关于多线程环境下如何访问共享变量的一种规范。JMM的主要目的是定义程序中各个变量(包括实例字段、静态字段和数组元素)的访问...

    Java内存结构.pdf

    ### Java内存结构详解 #### 一、概述 Java内存模型主要分为以下几个部分:堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(Program Counter Register)以及本地方法栈(Native Method Stack)。本文...

    JAVA内存分配

    ### JAVA内存分配详解 #### 一、JAVA内存结构概述 Java程序在运行过程中涉及的内存主要包括以下几个部分: 1. **方法区(Method Area)** 2. **栈内存(Stack Memory)** 3. **堆内存(Heap Memory)** 4. **本地...

Global site tag (gtag.js) - Google Analytics