`

JVM内存模型及结构

阅读更多

转载自并发编程网 – ifeve.com

 

所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?

Java内存模型

Java内存模型在JVM specification, Java SE 7 Edition, and mainly in the chapters “2.5 Runtime Data Areas” and “2.6 Frames”中有详细的说明。对象和类的数据存储在3个不同的内存区域:堆(heap space)、方法区(method area)、本地区(native area)。

堆内存存放对象以及数组的数据,方法区存放类的信息(包括类名、方法、字段)、静态变量、编译器编译后的代码,本地区包含线程栈、本地方法栈等存放线程

JUtH_20121024_RuntimeDataAreas_1_MemoryModel (1)
 

方法区有时被称为持久代(PermGen)。

JUtH_20121024_RuntimeDataAreas_2_MemoryModel (1)

所有的对象在实例化后的整个运行周期内,都被存放在堆内存中。堆内存又被划分成不同的部分:伊甸区(Eden),幸存者区域(Survivor Sapce),老年代(Old Generation Space)。

方法的执行都是伴随着线程的。原始类型的本地变量以及引用都存放在线程栈中。而引用关联的对象比如String,都存在在堆中。为了更好的理解上面这段话,我们可以看一个例子:

01 import java.text.SimpleDateFormat;
02 import java.util.Date;
03  
04 import org.apache.log4j.Logger;
05  
06 public class HelloWorld {
07     private static Logger LOGGER = Logger.getLogger(HelloWorld.class.getName());
08  
09     public void sayHello(String message) {
10         SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.YYYY");
11         String today = formatter.format(new Date());
12         LOGGER.info(today + ": " + message);
13     }
14 }

这段程序的数据在内存中的存放如下:

JUtH_20121024_RuntimeDataAreas_4_MemoryModel

通过JConsole工具可以查看运行中的Java程序(比如Eclipse)的一些信息:堆内存的分配,线程的数量以及加载的类的个数;

JUtH_20121024_RuntimeDataAreas_5_JConsole

 Java内存结构

这里有一份极好的白皮书:Memory Management in the Java HotSpot Virtual Machine。它描述了垃圾回收(GC)触发的内存自动管理。Java的内存结构包含如下部分:

JUtH_20121024_RuntimeDataAreas_6_MemoryModel

堆内存

堆内存同样被划分成了多个区域:

  • 包含伊甸(Eden)和幸存者区域(Survivor Sapce)的新生代(Young generation)
  • 老年代(Old Generation)

不同区域的存放的对象拥有不同的生命周期:

  • 新建(New)或者短期的对象存放在Eden区域;
  • 幸存的或者中期的对象将会从Eden区域拷贝到Survivor区域;
  • 始终存在或者长期的对象将会从Survivor拷贝到Old Generation;

生命周期来划分对象,可以消耗很短的时间和CPU做一次小的垃圾回收(GC)。原因是跟C一样,内存的释放(通过销毁对象)通过2种不同的GC实现:Young GC、Full GC。

为了检查所有的对象是否能够被销毁,Young GC会标记不能销毁的对象,经过多次标记后,对象将会被移动到老年代中。

哪儿的OutOfMemoryError

对内存结构清晰的认识同样可以帮助理解不同OutOfMemoryErrors:

Exception in thread “main”: java.lang.OutOfMemoryError: Java heap space

原因:对象不能被分配到堆内存中

Exception in thread “main”: java.lang.OutOfMemoryError: PermGen space

原因:类或者方法不能被加载到老年代。它可能出现在一个程序加载很多类的时候,比如引用了很多第三方的库;

Exception in thread “main”: java.lang.OutOfMemoryError: Requested array size exceeds VM limit

原因:创建的数组大于堆内存的空间

Exception in thread “main”: java.lang.OutOfMemoryError: request <size> bytes for <reason>. Out of swap space?

原因:分配本地分配失败。JNI、本地库或者Java虚拟机都会从本地堆中分配内存空间。

Exception in thread “main”: java.lang.OutOfMemoryError: <reason> <stack trace>(Native method)

原因:同样是本地方法内存分配失败,只不过是JNI或者本地方法或者Java虚拟机发现;

关于OutOfMemoryError的更多信息可以查看:“Troubleshooting Guide for HotSpot VM”, Chapter 3 on “Troubleshooting on memory leaks”

 

分享到:
评论

相关推荐

    JVM内存模型深度剖析与优化.pdf

    一、JVM内存模型结构 JVM内存模型主要分为以下几个部分: 1. 程序计数器(PC Register):存储当前线程执行的字节码指令地址。 2. Java虚拟机栈(Java Virtual Machine Stack):存储当前线程执行的方法调用和本地...

    JVM内存模型

    ### JVM内存模型详解 #### 一、概述 Java虚拟机(JVM)是Java程序运行的基础环境,它提供了一套完整的内存管理和执行机制。本文旨在深入探讨JVM内存模型的关键组成部分及其工作原理。 #### 二、类加载器...

    三问JMM--有关JVM内存模型的PPT

    ### 三问JMM——有关JVM内存模型的深度解析 #### 前言 近期,在诚信通开源研究小组的专题学习分享会上,我们针对Java内存模型(JMM)进行了深入探讨,现将JMM相关的一些核心概念进行梳理,以便更好地理解和把握JMM的...

    JVM内存模型-内存结构-内存屏障

    主要为大家讲解JVM内存模型|内存结构|内存屏障,他们的概念,有什么关联以及各种的功能

    Java 虚拟机JVM内存模型

    ### Java 虚拟机JVM内存模型知识点 #### 1. JVM概述 ##### 1.1 Java的特性与JVM的应用 Java语言的特性包括跨平台性、面向对象、安全性等。JVM是Java程序能够跨平台运行的关键,它负责将Java源代码转换成与平台无关...

    深入详解JVM内存模型与JVM参数详细配置.pdf

    knowledge point 1: JVM内存模型结构 JVM内存模型可以分为三个部分:堆内存、方法区和栈内存。其中,堆内存可以再细分为新生代和老年代,新生代中还可以再次划分为Eden区、From Survivor区和To Survivor区。栈内存...

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    标题中提到了JVM原理、JVM调优、JVM内存模型和JAVA并发,这些都是Java虚拟机(JVM)相关的核心概念。JVM是运行Java字节码的虚拟计算机,为Java提供了一个跨平台的环境,确保Java程序可以在不同的操作系统上运行而...

    02-VIP-JVM内存模型深度剖析(1)1

    总结来说,理解JVM内存模型和参数设置对于优化Java应用程序性能至关重要。正确配置JVM参数可以防止内存溢出,降低垃圾回收频率,提升系统响应速度。同时,逃逸分析等优化技术也是提高程序执行效率的有效手段。在实际...

    jvm的内存结构图的ppt模型分析.zip

    在“jvm的内存结构图的ppt模型分析”中,我们将深入探讨JVM内存的不同区域及其功能。 首先,JVM内存可以分为堆内存和栈内存两大主要部分,它们都是线程共享的。 1. **堆内存**:这是Java应用中所有对象实例的存储...

    JVM内存模型及方法区

    "JVM内存模型及方法区" JVM内存模型是Java虚拟机(Java Virtual Machine,JVM)中的一种内存管理机制。它将内存区域分为五个部分:程序计数器、Java虚拟机栈、本地方法栈、Java堆和方法区。 1. 程序计数器...

    JVM内存空间分配笔记

    #### 一、JVM内存模型概览 JVM(Java虚拟机)内存模型主要由以下几个部分组成:程序计数器、Java虚拟机栈、本地方法栈、Java堆以及方法区(在JDK 8之后称为元空间)。下面将对这几个部分进行详细介绍。 #### 二、...

    jvm的内存结构图的ppt模型分析

    jvm的内存结构图,详细的介绍了jvm运行的模型流程,包括jvm运行的五大内存分布。通过什么是jvm什么是java编程程序的=中的三个兄弟jdk.jvm和jre的区别

    面向对象和JVM内存模型.pdf

    面向对象是一种编程范式,它使用“对象”来设计软件。...开发者在编写Java代码时,需要理解这些基本概念,并能够合理地使用面向对象的特性以及管理JVM内存模型,以编写出高质量、高效率的Java应用程序。

    JVM内存模型fager20200614.docx

    《JVM内存模型详解》 Java虚拟机(JVM)内存模型是理解Java应用程序性能和内存使用的关键。本文将深入探讨HotSpot虚拟机中的内存结构,主要包括对象的创建、内存布局以及运行时数据区的各个部分。 首先,我们来看...

    02-VIP-JVM内存模型深度剖析(预习)1

    在理解JVM内存模型时,我们需要了解其整体结构以及如何设置内存参数,这对于优化性能至关重要。 一、JVM整体结构及内存模型 JVM内存模型主要分为以下几个区域: 1. **堆内存**:所有类实例和数组都在堆内存中分配...

    jvm性能调优-jvm内存模型和优化-performance-jvm-memorymodel-optimize.zip

    《JVM性能调优:深入理解JVM内存模型与优化》 在Java开发中,JVM(Java Virtual Machine)性能调优是提升应用程序效率的关键环节。JVM内存模型的理解和优化,对于解决性能瓶颈、避免内存泄漏以及提高系统稳定性至关...

    JVM内存配置优化

    #### 一、理解JVM内存模型 在进行JVM内存配置优化之前,我们需要了解Java虚拟机(JVM)的内存结构。Java的逻辑内存模型大致分为几个部分: 1. **堆内存(Heap)**:主要用于存储对象实例、数组等引用类型的数据。在...

    JVM内存结构、Java内存模型、Java对象模型1

    Java内存模型(JMM)与JVM内存结构不同,它是针对多线程环境下内存访问的抽象模型。JMM确保在多线程环境下,共享变量的读写操作具有正确的顺序和可见性,通过volatile、synchronized等关键字来实现这一目标。JMM关注...

    JVM内存模型深度剖析与生产环境深度优化

    作为一名对Java虚拟机(JVM)充满好奇的开发者,我深入研究了JVM的结构和内存模型,并分享了我的发现。在我的文章中,我详细介绍了Spring Boot应用中如何优化JVM内存参数,尤其是关于元空间(Metaspace)的配置。我...

Global site tag (gtag.js) - Google Analytics