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

了解java内存区域

阅读更多

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。 



 

 

1.程序计数器(线程私有)

一块较小的内存空间,存储当前线程所执行的字节码行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

 

 

2.Java虚拟机栈(线程私有)

描述的是Java方法执行的内存模型。每个方法执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型)。当JVM运行每个线程时,会为每个线程分配一个java虚拟机栈。包含执行当前方法的相关调用信息、当前方法的变量信息。

如果线程请求栈的深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;无法申请到内存抛出OutOfMemoryError异常(只由-Xss参数设置)。

 

3.本地方法栈(线程私有)

本地方法栈与虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法,而本地栈则为虚拟机使用到的Native方法服务。

native方法:http://ghsea.iteye.com/blog/72543 

 

4.Java堆(线程共享)

虚拟机启动时创建,此区域的唯一目的就是存放对象实例,是垃圾收集器管理的主要区域。很多时候也被称作“GC堆”,由于现在收集器基本都采用分代收集算法,所以Java堆中还可以细分为:新生代和老年代;再细致一点的有Eden空间、From Survivor空间、To Survivor空间等。 

在实现时,既可以实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的(通过-Xmx和-Xms控制),有可能抛出OutOfMemoryError。

 

5.方法区(线程共享)

用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据,又称“非堆”或者“永久代”,在java 8中逐步取消了,转而替换是metaspace(元数据区)。

这区域的内存回收目标主要是针对常量池的回收和对类型的卸载,可能抛出OutOfMemoryError。

 

6. 运行时常量池(线程共享)

方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池,用于存放编译期生成的各native引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

 

7.直接内存

直接内存不是虚拟机运行时数据区的一部分。但是这部分内存也被频繁地使用,而且也可能导致OutOfMemoryError异常出现。

 

在JDK1.4中新加入了NIO类,引入了一种基于通道与缓存区(buffer)的I/O方式,它可以使用 Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作,避免了在Java堆和Native堆中来回复制数据(可以通过-XX:MaxDirectMemorySize指定,如果不指定,则默认与Java堆最大值(-Xmx)一样)。

  • 大小: 641.6 KB
分享到:
评论

相关推荐

    Java内存泄露及内存无法回收解决方案

    首先,我们要了解Java内存模型。Java虚拟机(JVM)中有三个主要的内存区域:堆内存(Heap)、栈内存(Stack)和方法区(Method Area)。其中,堆内存是Java对象的主要存储场所,栈内存主要存储方法调用时的局部变量...

    如何解决Java内存泄漏

    因此,了解Java内存泄漏的成因、检测方法以及解决方案对于保证应用的高效稳定运行至关重要。 #### 2. Java内存回收机制 Java的内存管理主要集中在堆(Heap)区域,其中对象的创建通常是通过`new`关键字或反射方式...

    java实现内存动态分配

    这些区域在Java内存模型中同样占有重要地位,但在“java实现内存动态分配”的上下文中,主要关注堆和栈的动态分配。 综上所述,Java实现内存动态分配涉及到对堆内存、栈内存的理解,以及对垃圾回收机制的掌握。通过...

    Java 内存区域和GC机制

    Java内存区域和垃圾收集(GC)机制是Java...了解并熟练掌握Java内存区域和GC机制对于优化Java应用性能、排查内存问题至关重要。开发者应根据应用需求选择合适的JVM参数和垃圾收集器,并借助相关工具进行监控和调优。

    Java内存机制学习和使用

    通过深入了解Java内存机制,我们可以更好地管理应用程序的内存使用,避免出现内存泄漏等问题。此外,对于本机内存的理解有助于我们更全面地诊断和解决问题。随着Java应用程序变得越来越复杂,合理配置和优化内存管理...

    java内存泄漏解决

    #### 二、Java内存模型与内存区域 Java虚拟机(JVM)管理着多种不同类型的内存区域,包括堆内存(Heap Memory)、方法区(Method Area)、永久代(Permanent Generation Space)等。不同的内存区域有着不同的作用和特点: ...

    java内存管理 ppt

    Java内存管理是Java编程中的核心概念...了解并掌握Java内存管理有助于优化应用程序性能,避免内存泄漏,理解垃圾收集的工作原理,以及如何通过调整JVM参数来改善系统性能。对于Java开发者来说,这些都是必备的知识点。

    java内存分析-内存泄露问题.rar

    首先,我们需要了解Java内存模型的基础。Java内存主要分为三个区域:堆(Heap)、栈(Stack)和方法区(Method Area)。堆用于存储对象实例,栈用于存储方法调用及局部变量,而方法区则存储类信息、常量、静态变量等...

    java内存分配 .pdf

    在深入了解Java内存区域的同时,我们还需要关注Java对象在内存中的布局和访问方式。 ##### 2.1 对象的创建 对象创建时,首先会在内存中为其分配空间,然后初始化对象的状态。对象的空间分配通常在Java堆中进行,但...

    java内存分配情况

    Java内存分配主要涉及五个区域:寄存器、栈、堆、静态域和常量池。在Java编程中,理解这些内存区域的分配规则对于优化代码性能和避免内存泄漏至关重要。 1. **寄存器**:这是最快捷的存储区域,但不在Java程序员的...

    JAVA内存溢出

    JAVA内存溢出 JAVA中OutOfMemoryError(内存溢出)的三种情况及解决办法 Java中的OutOfMemoryError(内存溢出)是一种常见的错误,本文将详细介绍OutOfMemoryError的三种情况及其解决方法。 首先,我们需要了解...

    JAVA内存溢出详解.doc

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

    Java内存分配浅析

    了解这些内存区域后,我们可以通过实例来进一步理解Java程序的运行过程。例如,当创建一个类的实例时,JVM会在堆中分配空间,然后在栈中存储一个指向该对象的引用。对于基本类型的变量,它们的值直接存储在栈中;而...

    Java内存模型详解

    ### Java内存模型详解 #### 1. JMM简介 ##### i.... Java内存模型(Java Memory Model, JMM)是Java虚拟机(JVM...通过深入了解Java内存模型及其组成部分,开发者可以更好地编写出高效、稳定且易于维护的Java应用程序。

    深入理解java内存模型

    Java内存模型(Java Memory Model,JMM)是Java平台中非常关键的概念,它定义了线程如何共享和访问内存中的数据,以及在多线程环境下如何保证数据的一致性。这本书"深入理解Java内存模型"显然是为了帮助读者深入探讨...

    深入理解Java内存模型 pdf 超清版

    - **主内存**: 所有线程共享的内存区域,包含堆和方法区,线程间通信的媒介。 - **工作内存**: 每个线程的私有缓存,用于存储从主内存中复制的变量副本,执行计算操作后可能更新回主内存。 2. **内存间交互** - ...

    java内存分配机制详解

    Java内存分配主要涉及以下几个区域: 1. **寄存器**:由硬件直接支持,用于存储处理器级别的局部变量。程序员通常无法直接控制。 2. **栈**:用于存储基本类型的数据和对象的引用。当变量离开作用域时,栈内存会被...

    简单了解JAVA内存区域效果知识

    Java内存区域是理解Java应用程序性能和内存管理的关键概念。它主要分为以下几个部分: 1. **程序计数器**:这是每个线程私有的内存区域,非常小,用于存储当前线程执行的字节码指令的行号。如果线程执行Java方法,...

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

    了解Java内存区域的使用对于优化程序性能和解决内存溢出等问题至关重要。例如,通过合理调整堆大小、理解垃圾收集的工作原理以及避免过度使用静态变量,可以有效提高应用的效率和稳定性。开发者应当深入理解这些内存...

Global site tag (gtag.js) - Google Analytics