`

JVM内存模型和垃圾回收

    博客分类:
  • Java
 
阅读更多

JAVA堆的描述如下:

 

   内存由Perm和Heap组成。其中Heap = {Old + NEW = { Eden , from, to } }

  JVM内存模型中分两大块:

  NEW Generation:程序新创建的对象都是从新生代分配内存,新生代由Eden Space和两块相同大小的Survivor Space(通常又称S0和S1或From和To)构成,可通过-Xmn参数来指定新生代的大小,也可以通过-XX:SurvivorRation来调整Eden Space及Survivor Space的大小。垃圾回收一般用Copying的算法,速度快。每次GC的时候,存活下来的对象首先由Eden拷贝到某个Survivor Space, 当Survivor Space空间满了后, 剩下的live对象就被直接拷贝到Old Generation中去。因此,每次GC后,Eden内存块会被清空

  Old Generation:用于存放经过多次新生代GC任然存活的对象和应用程序中生命周期长的内存对象,例如缓存对象,新建的对象也有可能直接进入老年代,主要有两种情况:①大对象,可通过启动参数设置-XX:PretenureSizeThreshold=1024(单位为字节,默认为0)来代表超过多大时就不在新生代分配,而是直接在老年代分配。②大的数组对象,切数组中无引用外部对象。老年代所占的内存大小为-Xmx对应的值减去-Xmn对应的值。在Old Generation块中,垃圾回收一般用mark-compact的算法,速度慢些,但减少内存要求。

  PS:还有个Permanent Generation,主要用来放JVM自己的反射对象,比如类对象和方法对象等。

   

  垃圾回收描述:

  现在收集器都是采用分代收集算法,堆被划分为新生代和老年代。新生代主要存储新创建的对象和尚未进入老年代的对象。老年代存储经过多次新生代GC(Minor GC)任然存活的对象。

  Minor GC:即新生代GC,指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。垃圾回收分多级是1级或以上为部分垃圾回收,只会回收NEW中的垃圾。

  Major GC  / Full GC:老年代GC,指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在 ParallelScavenge 收集器的收集策略里就有直接进行 Major GC的策略选择过程) 。MajorGC 的速度一般会比Minor GC慢10倍以上。垃圾回收分多级是0级为全部(Full)的垃圾回收,会回收OLD段中的垃圾。

  PS:内存溢出通常发生于OLD段或Perm段垃圾回收后,Eden区仍然无内存空间容纳新的Java对象的情况。

  当一个URL被访问时,内存申请过程如下:

  A. JVM会试图为相关Java对象在Eden中初始化一块内存区域

  B. 当Eden空间足够时,内存申请结束。否则到下一步

  C. JVM试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收), 释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区

  D. Survivor区被用来作为Eden及OLD的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区

  E. 当OLD区空间不够时,JVM会在OLD区进行完全的垃圾收集(0级

  F. 完全垃圾收集后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”out of memory错误”

  为什么一些程序频繁发生GC?有如下原因:

  (1)程序内调用了System.gc()或Runtime.gc()。

   (2)一些中间件软件调用自己的GC方法,此时需要设置参数禁止这些GC。

  (3)Java的Heap太小,一般默认的Heap值都很小。

  (4)频繁实例化对象,Release对象。此时尽量保存并重用对象,例如使用StringBuffer()和String()。

  如果你发现每次GC后,Heap的剩余空间会是总空间的50%,这表示你的Heap处于健康状态。许多Server端的Java程序每次GC后最好能有65%的剩余空间。

 

  JVM 使用的GC算法是什么?

  分代收集。即将内存分为几个区域,将不同生命周期的对象放在不同区域里;

  在GC收集的时候,频繁收集生命周期短的区域(Young area);

  比较少的收集生命周期比较长的区域(Old area);

  基本不收集的永久区(Perm area)。

 

  GC何时会被触发?
  (1)系统空闲:GC线程的优先级低于系统应用线程,当系统中没有应用线程执行时,GC会被触发。
  (2)堆空间内存不足:当堆空间的内存不足以创建新对象时,GC会被触发。如果第一GC仍不能获得足够的空间,第二次GC将被触发,如果这一次仍无法获取足够的空间,“Out of memory”将被抛出。

分享到:
评论

相关推荐

    JVM内存模型以及垃圾回收相关资料

    JVM内存模型与垃圾回收是...总的来说,理解JVM内存模型和垃圾回收机制对于优化Java应用性能至关重要,它涉及到内存分配策略、垃圾收集算法的选择以及内存参数的调整,这些都需要开发者具备深入的JVM知识和实践经验。

    jvm内存模型以及垃圾回收机制.pptx

    Java虚拟机(JVM)内存模型...理解JVM内存模型和垃圾回收机制对于优化Java应用性能、避免内存泄漏和有效利用资源至关重要。开发者应根据实际需求选择合适的垃圾回收器,并关注内存分配策略,以实现高效稳定的程序运行。

    jvm内存模型以及垃圾回收机制.rar

    在实际开发中,理解JVM内存模型和垃圾回收机制对于优化应用程序性能、避免内存泄漏和有效利用资源至关重要。通过调整JVM参数,如堆大小、新生代和老年代的比例、垃圾收集器的选择等,可以改善程序的运行效率和稳定性...

    JVM内存分配与垃圾回收详解

    JVM 内存分配与垃圾回收详解 Java 虚拟机(JVM)是 Java 语言的 runtime 环境,它提供了一个平台独立的方式来执行 Java 字节码。JVM 内存分配与垃圾回收是 JVM 中两个非常重要的概念,本文将对 JVM 内存分配与垃圾...

    JVM内存模型与垃圾回收(处理方案示例).md

    JVM内存模型与垃圾回收(处理方案示例).md

    java.JVM内存模型与垃圾回收(解决方案).md

    java.JVM内存模型与垃圾回收(解决方案).md

    JVM内存模型及垃圾回收

    通俗的来讲,jvm主要分为5个部分 程序计数器、虚拟机枝、本地方法枝、 Java 堆、 方法区, 引用大佬总结的概括程序计数器用于存放下一条运行的指令,虚拟机栈和本地方法栈用于存放函数调用堆栈信息, Java 堆用于...

    java.JVM内存模型与垃圾回收(处理方案示例).md

    java.JVM内存模型与垃圾回收(处理方案示例).md

    JVM入门实战/arthas实战/垃圾回收算法/垃圾回收器/jvm内存模型分析

    第二节:JVM内存模型 1.1 概念 1.2 JVM内存模型 1.3 Heap堆内存模型 第三节:定位垃圾对象的依据 1.1 引用计数法 1.2 可达性算法 第四节:垃圾回收算法 1.1标记清除算法 1.2复制算法 1.3 标记整理(标记压缩)...

    JVM内存模型详解

    jvm内存模型,jvm脑图,jvm调优,jvm垃圾回收算法,jvm垃圾回收器,逃逸算法等总结。

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

    JVM内存模型是Java虚拟机的核心组件之一,它直接影响着Java应用程序的性能和可靠性。本文将深入剖析JVM内存模型的结构和工作机理,并讨论如何优化JVM参数以提高Java应用程序的性能。 一、JVM内存模型结构 JVM内存...

    JVM的内存模型,垃圾回收,GC

    JVM的内存模型,垃圾回收,GC

    jvm_gc.rar_jvm_垃圾回收

    了解JVM内存模型和垃圾回收机制对于Java开发人员来说非常重要,可以帮助解决内存溢出、性能瓶颈等问题,提升程序的稳定性和效率。通过深入学习这些概念,可以更好地理解和控制Java程序在运行时的行为。

    JVM内存模型以及垃圾收集策略解析

    总的来说,理解和掌握JVM内存模型及垃圾收集策略对于优化Java应用程序的性能至关重要。开发者需要根据应用特点调整内存参数,选择合适的垃圾收集策略,以避免内存溢出、提高系统效率并确保程序的稳定运行。

    java.JVM内存模型与垃圾回收.md

    项目中碰到的,记录一下

    JVM 38道面试题及答案.docx

    JVM 内存模型和垃圾回收机制 JVM 的内存模型可以分为五个部分:方法区、堆、栈、本地方法栈和程序计数器。每个部分都有其特定的功能和生命周期。 方法区是 JVM 内存模型中最大的区域,用于存储虚拟机加载的类信息...

    JVM性能调优-JVM内存整理及GC回收

    这份文档详细阐述了JVM性能调优的关键概念,包括JVM内存模型、垃圾回收(Garbage Collection, GC)的原理以及各种垃圾回收算法,这些都是JAVA程序员在日常工作中需要理解和掌握的核心技术。 首先,JVM内存模型是...

    JVM内存模型及垃圾收集策略解析

    在深入理解JVM内存模型与垃圾收集策略之前,我们首先需要知道JVM的主要组成部分:类装载器、运行数据区、执行引擎、本地方法接口和本地方法库。 1. **JVM内存模型** JVM内存主要分为以下几个区域: - **程序...

    jvm学习笔记(jvm内存模型&垃圾收集算法&类加载机制)

    1. **JVM内存模型** - **方法区**:也称为“永久代”,存储虚拟机加载的类信息、常量、静态变量等,是线程共享的区域。在Java 8之后,这部分被元空间(Metaspace)取代。 - **运行时常量池**:是方法区的一部分,...

Global site tag (gtag.js) - Google Analytics