`
szh_java
  • 浏览: 78959 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java虚拟机(JVM)内存结构和垃圾回收机制(GC)详解以及内存溢出(out of memory)的分析

    博客分类:
  • java
 
阅读更多

一、JVM介绍

jvm是java virtual machine 的简称,它是java虚构出来的计算机,有自己的指令集,寄存器和堆栈内存。它屏蔽了java应用程序与具体的操作平台相关的信息,java程序只需生成jvm的目标代码既字节码,jvm通过对字节码的解释最终转化为具体平台的指令,实现了java的跨平台。

二、内存简介

jvm结构可以看成是堆内存和非堆内存组成,堆是运行时内存对象的实例化,数组内存的分配都是由此内存划分。堆内存之外的称为非堆内存。堆内存是java代码可及的内存,而非堆内存是jvm留给自己使用的,例如内部优化所需的内存,类的信息,final常量,类的构造方法。(下第四部分有对此节的详细介绍

三、垃圾回收(GC)

GC是jvm的垃圾回收,当实例化一个java对象的时候jvm为此对象分配一块内存,当此对象不再被使用时,由jvm自动回收此内存块。不用人为的释放内存,降低了内存溢出的风险。

GC算法通常有两种,一是引用计数,当对象创建、引用时该对象的计数增加,引用超出作用域或者对象为空的时候,此计数减少。当计数为0的时候此对象可以回收。二是对象引用遍历,也称向图法。就是从根开始沿着整个对象图遍历,标记可到达的对象。再通过扫描整个堆栈处理不可到达的对象。

这两种算法对应了多种实现机制

1,标记-清除

2,标记-压缩

这两种机制是对不可到达的对象进行清理、压缩处理。

3,复制机制

这种机制将堆栈分为两个区域,称为半空间。每次使用一半的空间,生成的新对象在一个空间GC时将可到达的对象复制到另一个空间,从而实现堆栈的压缩。

4,增量机制

这种机制是将内存分为多个区域,每次从一个区域进行垃圾回收。

5,分代机制

这个一个比较常用的机制,这种收集机制是将堆栈分为两个或多个区域。用于存放不同寿命的对象,根据对象的使用频率分配不同寿命的区域。

以上机制称为串行GC,GC的时候会造成程序的暂停,jvm还有基于多线程的GC,称为并行GC和并发GC,他们的扫描复制都是在多线程的基础上进行的不会造成程序的暂停,适用于多cpu和对暂停时间要求较短的应用程序。是server级默认的GC机制。

 

四、关于out of memory

这里有必要再重新详细的说一下jvm的结构。jvm分为堆内存和非堆内存,对内存分为新生代区、旧生代区,非堆内存称为永久区。新生代区又分为Eden和survivior区,survivor区分为FromSpace和toSpace

jvm在GC的时候对不同的区域进行了区别对待,对新生代区会进行频繁的GC,使用的是coyping机制,对旧生代区采用的是标记机制。

所有新创建的对象存在于Eden区,当Eden的内存不足时,将依旧存活的对象拷贝到survivor区中的FromSpace,ToSpace中的一个区。如果这个区也是不足的那么将此区域的存活的对象拷贝到另一个区,然后清除此区。就是说FromSpace和ToSpace总有一个是空的。对新生代的GC叫作minor GC,通常对象活不过这次GC

当一个Survivor的区满的时候,会将此区域中经过一定次数GC依旧活着的对象放到旧生代区,如果旧生代区满了的话就会发生FULL GC,Full GC相当耗资源,Full GC的时候应用程序会暂停。

永久区内存装载的类的信息,常量池,如果常量池无限大,或者要装载大量的class或者动态生成类。这个区域占有内存也会增大。也会发生FULL GC。

不论堆内存还是非堆内存内存虽然GC能释放一些内存空间,但是内存不足的情况还是会发生,

堆内存空间不足会出现 java.lang.OutOfMemoryError: heap space

非堆内存不足会出现 java.lang.OutOfMemoryError: PermGen space

 

   堆内存大小设置参数 -Xms512m -Xmx512m

   非堆内存大小设置参数 -XX:PermSize=256m -XX:MaxPermSize=256m

 

Xms指堆内存的初始值(默认物理内存的1/64),Xmx是指堆内存最大值(默认物理内存的1/4)。当堆内存的剩余空间不足40%的时候堆内存大小扩大到最大值Mmx,当剩余空间大于70%的时候堆内存减小为初始值。堆内存大小的变化也是消耗资源消耗性能的动作,将这两个参数设为一样可以避免堆内存变化带来的性能消耗(非堆内存同理)。

分享到:
评论

相关推荐

    java虚拟机JVM详解ppt

    通过对Java虚拟机JVM的基本概念、架构以及内存管理机制的深入解析,我们可以更好地理解Java程序的执行过程。掌握JVM的工作原理有助于开发者编写更高效、更稳定的Java应用程序,并能有效地解决常见的内存溢出问题。

    java虚拟机jvm及Tomcat中的jvm有关内存的设置与调优

    ### Java虚拟机(JVM)内存设置与调优详解 #### 引言 在现代软件开发中,Java虚拟机(JVM)作为执行Java字节码的核心组件,其性能直接影响到Java应用的运行效率与稳定性。特别是在大数据处理场景下,合理设置JVM内存...

    JAVA内存溢出详解.doc

    Java内存溢出(Out Of Memory,OOM)是Java应用程序运行时常见的问题,它通常发生在程序对内存需求超过了Java虚拟机(JVM)所能提供的可用内存时。本文将深入探讨Java内存溢出的原因、表现以及如何解决。 1. **Java...

    实战JAVA虚拟机 JVM故障诊断与性能优化

    通过对JVM的基本原理和内部机制有深入的理解,结合实际应用场景,采取合理的故障诊断手段和性能优化策略,可以显著提升Java应用的性能表现。在未来的工作中,随着业务规模的不断扩大和技术的不断进步,这些技能将变...

    深入java虚拟机(一)——java虚拟机底层结构详解1

    堆被分为新生代(Young Generation)和老年代(Tenured Generation),新生代又分为Eden空间、From Survivor和To Survivor空间,以支持不同生命周期的对象存储和垃圾回收策略,如 Minor GC 和 Major GC。 除此之外...

    Java虚拟机(JVM)面试题(2022最新版)-重点

    **内存泄漏(Memory Leak):** Java虽然有自动垃圾回收机制,但在某些情况下仍然可能出现内存泄漏,如长时间持有的无用对象引用、静态集合类等。内存泄漏会导致可用内存逐渐减少,最终可能导致性能下降甚至崩溃。 ###...

    java内存泄露、溢出检查方法和工具

    在理解内存泄露和溢出之前,我们需要先了解Java虚拟机(JVM)的基本内存结构及其管理机制: 1. **JVM内存区域**: - **年轻代(Young Generation)**: 包括Eden区和两个Survivor区(S0、S1)。新创建的对象首先在这里...

    MAT解析hprof内存溢出分析工具OutOfMemoryError-java程序开发

    MAT(Memory Analyzer Tool)是IBM提供的一款强大的Java内存分析工具,它专为解决此类问题而设计,帮助开发者深入理解内存消耗,有效地定位内存泄漏和性能瓶颈。 MAT的使用方法和功能详解: 1. **数据获取**:首先...

    Java内存机制学习和使用

    除了Java堆内存之外,Java应用程序还需要使用到**本机内存**(Native Memory),这是指JVM之外的内存,主要用于存储JVM自身的元数据、线程栈以及一些非Java对象的数据结构。 - **元数据**:包括类定义、字段信息、...

    JVM详解-淘宝内部资料

    "JVM详解-淘宝内部资料"提供了一套深入理解JVM的资源,涵盖了从基础到高级的各种主题,包括Java虚拟机的生命周期、JVM的体系结构、各个组件的详细解析以及垃圾收集(Garbage Collection, GC)机制等内容。...

    jvm -spark-优化

    - Spark中,JVM的垃圾回收机制依赖于特定的内存结构,包括年轻代(Young Generation)和老年代(Old Generation)。年轻代通常包含Eden空间和两个Survivor空间(From和To),而老年代则负责长期存活的对象。 通过...

    JVM虚拟机面试题汇总

    4. **内存溢出(Out Of Memory Error, OOM)**: - **堆溢出**:对象实例数量超过最大堆容量限制。 - **虚拟机栈和本地方法栈溢出**:线程请求的栈深度大于虚拟机所允许的最大深度,或虚拟机在扩展栈时无法申请到...

    JVM内存参数调优

    在Java开发过程中,合理地配置JVM(Java虚拟机)的内存参数对于提高程序运行效率、避免内存溢出等问题至关重要。本文将深入探讨JVM内存参数调优的相关知识点,帮助开发者更好地理解并掌握如何优化JVM的内存设置。 #...

    一、JVM内存区域1

    JVM内存区域详解 JVM 内存区域是 Java 虚拟机在执行 Java 程序的过程中所管理的内存划分。这些区域都有自己的用途,以及创建和销毁的时间。有的区域随着虚拟机的启动而存在,有些区域则依赖用户线程的启动和结束而...

    JVisualVM简介与内存泄漏实战分析

    内存溢出(Memory Leak)是指程序在申请内存后未能释放已经不再使用的内存,导致随着时间推移,可用内存越来越少,最终导致程序或整个系统崩溃的情况。JVisualVM提供了多种工具来帮助开发者定位和解决这类问题。 ##...

    java堆栈详解 PDF 下载

    6. 内存溢出(Out of Memory Error) - 如果堆内存不足,JVM会抛出`OutOfMemoryError: Heap Space`异常。 - 栈内存不足则抛出`OutOfMemoryError: Stack Size`异常。 了解这些基础知识对于优化Java应用程序性能至...

    Java垃圾收集器使用小诀窍

    Java垃圾收集器是Java虚拟机(JVM)中一个非常重要的组件,它负责管理Java程序中的内存资源,防止内存泄露和溢出。垃圾收集器的使用小诀窍可以帮助开发者写出高效的Java程序,避免内存相关的问题。 Java中的内存...

    Weblogic内存大小配置

    当Java堆或本地内存耗尽时,JVM会抛出“Out of Memory Error”,即OOM错误。对于Java堆内存不足,JVM会尝试触发垃圾回收,如果仍无法解决问题,则会抛出异常并终止应用程序。本地内存不足则可能更难以定位,因为其...

    JVM调优world总结

    - JVM通过堆内存存储Java对象,若垃圾回收不及时,创建过多对象可能导致内存溢出。 - 内存计算公式:总内存 = 堆内存(Xmx) + 方法区内存(MaxPermSize) + 栈内存(Xss) * 线程数 + 直接内存(MaxDirectMemorySize, 堆...

Global site tag (gtag.js) - Google Analytics