最近在看JVM的书籍,为加深自己的印象,打算边看边记录自己看后的总结。欢迎大家给出意见
平常我们都把Java虚拟机的内存分为‘栈内存’和‘堆内存’,其实,这是很粗略的,因为Java虚拟机的内存管理,
远远比这个要复杂的多。
Java虚拟机的内存管理,大致可分为5部分:
1、程序计数器
2、虚拟机栈
3、本地方法栈
4、堆
5、方法区
以上5个部分中,虚拟机栈就是我们程序员平常所说的栈内存,堆就是我怕们程序员平常所说的堆内存。
1、程序计数器:
顾名思义,它的作用就是告诉虚拟机,应该执行程序中哪一行代码。它占用一块较小的内存区域,是当前线程所致行的字字节码的行号指示器。
大家都知道,java代码需要编译成二进制class字节码文件才能在Java虚拟机中执行,执行在Java虚拟机中,执行calss文件的部分叫做字节码解释器,而字节码工作时,就是通过改变这个程序计数器的值,來选取下一条需要执行的字节指令。
Java虚拟机的多线程是通过线程轮流切换分配处理器执行时间的方式。故,为了保证各个线程之间的计数器互不影响,每个线程都有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,这块内存区域,我们称之为‘线程私有’的内存。
如果线程执行的是一个Java方法,这个计数器记录的就是正在执行的虚拟机字节码指令的地址。
如果线程执行的是一个Native方法(本地方法,即JNI技术,指Java直接调用其他语言代码(如C语言)进行交互),这个计数器值则为空(Undefined),此区域是唯一一个在Java虚拟机规范中,没有规定任何OutOfMemoryError情况的区域。
2、虚拟机栈
它也是线程私有的。它有若干个栈帧组成,栈帧,是在每个方法被执行所创建,用于存储局部变量表、操作栈、动态链接、方法出口等信息。每个方法被调用,到执行完成的过程,就对应着一个栈帧在虚拟机栈中,从入栈到出栈的过程。
局部变量表:我们所说的栈内存,具体点,就是指虚拟机栈中的局部变量表。
局部变量表存放了在编译期可知的各种基本数据类型、对象引用和returnAddress类型(指向一条字节码指令的地址)。其中,64为长度的long和double类型,会占用两个局部变量空间(Slot),其余都只占用一个。局部变量表所需要的内存空间,都是在编译期间完成分配,在运行期间,不会改变局部变量表的大小。
此区域的两种异常:
* 线程请求的栈深度大于虚拟机所允许的深度,抛出StackOverflowError
* 虚拟机栈动态扩展时,超过Java虚拟机规范允许的固定大小,抛出OutOfMemoryError
3、本地方法栈
与虚拟机栈类似,区别是本地方法栈是为虚拟机使用Native方法服务的。
4、堆
Java堆,是Java虚拟机内存中最大的一块。共享于所有线程。它用于存放对象的实例,差不多所有的对象实例,都在这里分配。Java堆可以处在物理不连续的内存空间中,但逻辑上要连续。
如果堆中没有内存完成实例分配时,将会抛出OutOfMemoryError
5、方法区
与Java堆类似,也是各个线程共享的内存区域。它用于存储已被虚拟机加载的类信息、常量、静态变量、即使编译的代码等数据。它有个别名:Non-Heap(非堆),目的为了与堆区分开。
对此区域,可以选择不实现垃圾回收。相对与堆,在这个区域,发生垃圾回收的行为是比较少见。这个区域回收的目标,主要针对常量池回收和类型卸载。
运行常量池:方法区的一部分。Class文件中,除了有类的版本、字段、方法、接口等描述信息外,还有一项,就是常量池,用于存放编译期生成的各种字面量和符号引用。这部分在类加载器加载后,存放在方法区的运行常量池中。
运行常量池具备动态性,就是说在运行期间,也可以将新的常量放入池中,如String类的intern()方法。同样,它也有OutOfMemoryError异常。
进一步理解
如下面这条语句
Object obj = new Object();
Object obj将会反映到虚拟机栈中(reference类型)
new Object()将会反映到Java堆中
此类的对象类型、父类、实现的接口、方法等信息数据,将反映到方法区中
如果是下面的语句呢?
int i = 1;
这个就留给各位看官自己思考吧,呵呵!
分享到:
相关推荐
Java虚拟机内存管理总结 Java虚拟机(JVM)中的内存管理是指Java语言中对象的分配和释放问题。Java中的内存管理可以分为两部分:对象的分配和释放。 对象的分配是由程序完成的,程序员需要通过关键字new为每个对象...
支持复合对象的Java虚拟机内存管理技术研究 在面向对象系统中,对象是研究的基本单位,对象可以是简单的整数或复杂的飞机等。对象具有状态和操作,对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。...
在Java虚拟机内存管理中,垃圾回收机制的存在经常被初级程序员所忽略,因为它自动管理内存的回收,但对高级程序员来说,理解内存管理的原理和机制是必须的。 首先,我们需要了解JVM内存结构。JVM内存主要分为堆内存...
本文将深入探讨Java虚拟机的内存管理以及如何识别和防止内存泄漏。 1. **Java内存区域** - **堆内存**:存储所有对象实例和数组。Java的垃圾收集器主要在堆上工作。 - **栈内存**:存储方法局部变量,每个线程有...
以下是对Java虚拟机内存模型的详细解读。 1. **程序计数器(Program Counter Register)** - 这是每个线程私有的内存区域,用于存储当前线程执行的字节码的地址,每次方法调用都会更新这个计数器,以便下一次知道...
Java虚拟机内存区域的管理是Java开发中最重要的内容之一,对于Java开发者来说,了解Java虚拟机内存区域模型是非常必要的。只有了解了Java虚拟机内存区域模型,才能更好地编写高效、可靠的Java程序。 程序计数器是...
深入 Java 虚拟机.pdf Java 虚拟机(Java Virtual Machine,JVM)是 Java 语言的 runtime 环境,是 Java 程序...Java 虚拟机也提供了自动内存管理、垃圾收集、多线程支持等功能,提高了 Java 程序的可靠性和性能。
垃圾回收是Java虚拟机内存管理的核心部分,它负责回收堆中不再被引用的对象所占用的空间。垃圾回收器的工作是识别出哪些内存是“垃圾”,即不再被引用的内存区域,并释放这些内存。JVM提供了多种垃圾回收算法,包括...
### JAVA虚拟机的内存管理详解 #### 一、引言 在Java 2平台的强大支持下,J2SE能够自动管理内存,这大大减轻了开发者的负担,让他们不必再进行复杂的显式内存管理工作。本文档旨在对Sun J2SE 5.0版本中的Java ...
本篇文章将深入探讨基于Java虚拟机内存模型的性能调优方法,帮助开发者优化应用程序,提高系统效率。 1. **Java内存模型** Java内存模型,也称为JVM内存结构,主要包括堆内存、栈内存、方法区、程序计数器和本地...
每个区域承担不同的内存管理职责,保证Java程序的稳定运行。 ##### 2.5 JVM内存模型详解 - **2.5.1 Java栈** Java栈用于存储局部变量和方法调用的状态,每个线程都有自己的Java栈,支持线程的独立执行。 - **...
这对于优化代码、调试问题、理解垃圾收集机制、内存管理以及JVM调优等方面都非常有用。虽然规范描述的是虚拟机的概念模型,而不是具体的实现,但它为分析和改进Java应用程序的性能提供了理论基础。 总之,《Java...
Java虚拟机(JVM)是实现Java技术的关键组件,它为Java程序提供了一个运行环境。Java程序在编写后会被编译成一种称为字节码的中间表示形式,这种字节码可以跨平台运行,因为JVM负责将字节码转换成机器代码。JVM的...
垃圾收集自动管理内存,避免程序员手动处理内存泄露问题;JIT编译则是在运行过程中将频繁执行的热点代码编译成本地机器码,提升运行效率。 总的来说,Java虚拟机是Java生态系统中的关键组件,它使得Java程序能够在...
3. **垃圾收集与内存管理**:JVM负责自动管理内存,包括对象的分配和回收。垃圾收集器是其重要组成部分,通过标记-清除、复制、标记-整理和分代收集等多种算法来释放不再使用的内存。 4. **类加载过程**:类的生命...
根据提供的文件内容,以下是关于JAVA虚拟机(JVM)内存使用优化的知识点: 1. JVM内存优化的重要性:在运行Java应用程序时,尤其是涉及到大量数据查询和高并发操作的场合,系统可能由于内存溢出而不稳定。JVM内存...
使用 JAVA 虚拟机解决内存管理问题 JAVA 虚拟机是运行在主操作系统顶层的软件层,使通讯程序、Java 应用程序与任何底层硬件的改变互不相关。虚拟机技术是 Java 成功地移植到嵌入式系统的关键。Java 虚拟机是一种...
Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了跨平台的运行环境。Java程序在编写完成后,会被编译成字节码(.class文件),这些字节码可以在任何装有JVM的系统上运行,实现了“一次编写,到处...