`

JVM学习笔记-堆(Heap)

 
阅读更多

 

     对于大多数应用来说,Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配①,但是随着JIT编译器的发展与逃逸分析技术的逐渐成熟,栈上分配、标量替换②优化技术将会导致一些微妙的变化发生,所有的对象都分配在堆上也渐渐变得不是那么“绝对”了。 

 

      Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC堆”(Garbage Collected Heap,幸好国内没翻译成“垃圾堆”)。如果从内存回收的角度看,由于现在收集器基本都是采用的分代收集算法,所以Java堆中还可以细分为:新生代和老年代;再细致一点的有Eden空间、From Survivor空间、To Survivor空间等。如果从内存分配的角度看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)。不过,无论如何划分,都与存放内容无关,无论哪个区域,存储的都仍然是对象实例,进一步划分的目的是为了更好地回收内存,或者更快地分配内存。在本章中,我们仅仅针对内存区域的作用进行讨论,Java堆中的上述各个区域的分配和回收等细节将会是下一章的主题。 

根据Java虚拟机规范的规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,就像我们的磁盘空间一样。在实现时,既可以实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的(通过-Xmx和-Xms控制)。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。

 

以上描述截取自: 

《深入理解Java虚拟机:JVM高级特性与最佳实践》 作者: 周志明 

----------------------------------------------------------------------------------------------------------------------------------

 

 

 

Whenever a class instance or array is created in a running Java application, the memory for the new object is allocated from a single heap. As there is only one heap inside a Java Virtual Machine instance, all threads share it. Because a Java application runs inside its "own" exclusive Java Virtual Machine instance, there is a separate heap for every individual running application. There is no way two different Java applications could trample on each otherís heap data. Two different threads of the same application, however, could trample on each otherís heap data. This is why you must be concerned about proper synchronization of multi-threaded access to objects (heap data) in your Java programs.

The Java Virtual Machine has an instruction that allocates memory on the heap for a new object, but has no instruction for freeing that memory. Just as you canít explicitly free an object in Java source code, you canít explicitly free an object in Java bytecodes. The virtual machine itself is responsible for deciding whether and when to free memory occupied by objects that are no longer referenced by the running application. Usually, a Java Virtual Machine implementation uses a garbage collector to manage the heap.

 

java 程序在运行时创建的 所有类实例或数组都放在同一个堆中 。而 一个Java 虚拟机实例 只存在一个堆内存空间 ,因此所有的线程均 共享这个堆 。又由于一个java 程序独占一个Java 虚拟机实例,因而每个java 程序都有他自己的堆内存---- 他们之间不会相互影响。但是同 一个Java 程序的多线程却共享着同一个堆空间 ,在这种情况下,就得考虑多线程访问对象(堆数据)的同步问题了。

 

Java虚拟机有一条在堆中分配新对象的指令,但是没有释放内存的指令。java虚拟机的垃圾回收机制负责回收没有被使用的内存。

只要有一个对象引用,虚拟机就必须能够快速定位对象类型的数据。另外它也必须通过该对象引用访问相应的类数据(存储于方法区中的类型信息)。因此在对象中通常会有一个指向方法区的指针。

 

 

以上描述截取自: 

《Inside the Java Virtual Machine 2nd Edition》 作者:Bill Venners   

 

 

 

分享到:
评论

相关推荐

    JVM学习笔记(一)

    ### JVM学习笔记(一) #### 一、JVM概述与工具使用 JVM(Java Virtual Machine)是Java语言的核心组成部分之一,它为Java程序提供了一个跨平台的运行环境。本篇学习笔记主要介绍如何利用一系列工具来查看和监控JVM...

    虚拟机学习笔记--周志明老师第三版

    虚拟机学习笔记 Java 虚拟机(JVM)是 Java 语言的 runtime 环境,负责加载、验证、执行 Java 字节码。以下是 JVM 相关知识点的总结。 1. 运行时数据区域 JVM 的运行时数据区域主要包括: * 堆(Heap):...

    JVM性能学习笔记思维导图

    本文将根据"JVM性能学习笔记思维导图"的主题,详细阐述JVM的主要组成部分,性能调优的关键点以及相关的工具与实践策略。** 1. **JVM结构与内存模型** - **类装载器(ClassLoader)**:负责加载类文件,确保类在运行...

    jvm学习笔记

    《JVM学习笔记》 Java虚拟机(JVM)是Java平台的核心组成部分,它负责运行所有的Java应用程序。这篇笔记将深入探讨JVM的工作原理、内存管理、类加载机制以及优化策略,帮助读者全面理解JVM并提升Java程序的性能。 ...

    ImagesForJVM-JVM笔记图片

    【描述】"ImagesForJVM——JVM笔记图片" 暗示这些图片可能是教学或学习笔记的一部分,旨在通过视觉化的方式解释JVM的关键概念,如内存模型、类加载机制、垃圾收集以及性能优化等方面。 【标签】"java" 明确了这些...

    JVM-LearningAndOptimize:JVM学习笔记与调优实战

    《JVM学习笔记与调优实战》是一本深入探讨Java虚拟机(JVM)的书籍,旨在帮助读者理解和掌握JVM的工作原理以及如何进行性能优化。在这个项目中,作者不仅分享了理论知识,还提供了实战调优的经验。下面将详细讨论JVM...

    深入JVM笔记word版

    ### 深入解析 JVM 内存区域 #### 一、Java内存区域概述 Java虚拟机(JVM)作为Java程序的运行环境,负责管理和分配内存...理解这些区域对于深入学习JVM原理至关重要,也有助于开发者编写更加高效和可靠的Java应用程序。

    JVM内存管理学习笔记

    《JVM内存管理学习笔记》 在Java世界中,JVM(Java Virtual Machine)是运行所有Java应用程序的核心。深入理解JVM内存管理对于优化程序性能、预防和解决内存泄漏问题至关重要。本文将从JVM内存模型、内存区域划分、...

    黑马JVM学习笔记二

    然而,如果对象不断创建且没有及时被回收,可能导致堆内存溢出(OutOfMemoryError: Java heap space)。诊断堆内存问题可以使用JDK提供的工具,如`jps`列出Java进程,`jmap`分析堆内存详细信息。 在实际开发中,...

    jvm-juc:jvm学习笔记

    2. 运行时数据区:包括堆内存(Heap)、方法区(Method Area)、虚拟机栈(JVM Stack)、本地方法栈(Native Method Stack)和程序计数器(PC Register)。其中,堆是所有线程共享的内存区域,主要存储对象实例;...

    JVM性能调优经典教程

    1. **内存管理**:JVM内存分为堆内存(Heap)和非堆内存(Non-Heap),包括年轻代(Young Generation)、老年代(Tenured Generation)以及永久代(PermGen,Java 8后被元空间(Metaspace)取代)。了解每个区域的...

    JVM思维导图,学习思维笔记

    本思维导图及学习笔记将深入探讨JVM的工作原理、内存模型、垃圾收集机制以及性能优化等方面,帮助你全面理解这个至关重要的技术。 一、JVM概述 Java虚拟机是Java平台的一部分,它负责解析字节码并执行Java程序。JVM...

    JAVA-JVM-全面/发展史/GC.zip

    JVM的内存模型包括堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)。其中,堆是所有对象的存储空间,而栈则存储方法调用的状态。 垃圾回收(GC)...

    JVM内存结构笔记.rar

    Java虚拟机(JVM)是Java程序运行的核心,它的内存结构对于理解和优化Java应用程序的性能至关重要。本笔记将深入探讨JVM内存的...这份"JVM内存结构笔记"将详细阐述这些内容,是学习和研究JVM内存管理的重要参考资料。

    eclipse性能优化 <深度理解jvm>读书笔记

    1. **JVM内存模型**:JVM内存分为堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)。理解这些区域的作用以及它们之间的交互对于优化内存使用至关...

    JVM和性能优化学习思维笔记.rar_java

    2. **内存模型**:JVM内存分为堆内存(Heap)、栈内存(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)。堆内存用于存储对象实例,栈内存存储方法调用,方法区存储...

    Java学习笔记

    ### Java学习笔记知识点详解 #### 一、Java环境配置与基本概念 - **系统变量path**: 在设置Java开发环境时,需要配置系统变量`path`,这样计算机才能找到执行Java命令所需的程序。例如,当我们输入`javac`或`java`...

    Java - JVM: 读书笔记 Chapter 05 The Java Virtual Machine ( Part I Basic )

    1. **JVM内存结构**:JVM内存分为几个主要区域,包括方法区(Method Area)、堆(Heap)、栈(Stack)、本地方法栈(Native Method Stack)、程序计数器(Program Counter Register)。每个区域都有其特定的功能,...

Global site tag (gtag.js) - Google Analytics