技术分享-JVM内存管理与GC

合集下载

jvm的gc原理

jvm的gc原理

jvm的gc原理JVM的GC原理一、概述JVM(Java虚拟机)是Java程序运行的环境,其中最重要的组成部分之一就是垃圾回收(Garbage Collection,简称GC)机制。

GC的作用是自动管理程序中的内存,及时释放不再使用的对象,以避免内存泄漏和内存溢出的问题。

本文将对JVM的GC原理进行详细介绍。

二、垃圾回收算法1. 标记-清除算法标记-清除算法是最基本的垃圾回收算法之一。

它的过程分为两个阶段:标记阶段和清除阶段。

在标记阶段,GC会从根节点(一般是程序中的静态变量和栈中的引用)开始,递归地遍历对象图,标记出所有被引用的对象。

在清除阶段,GC会遍历整个堆,清除所有未被标记的对象。

2. 复制算法复制算法是针对标记-清除算法的改进。

它将堆分为两个区域,每次只使用其中一个区域。

当一个区域的对象被标记后,将其复制到另一个区域中,然后清除原来的区域。

这样可以解决碎片问题,但是需要额外的空间来存储复制的对象。

3. 标记-整理算法标记-整理算法是对标记-清除算法的改进。

它的过程与标记-清除算法类似,但是在清除阶段,标记-整理算法会将存活的对象向一端移动,然后清除边界外的所有对象。

这样可以解决碎片问题,并且不需要额外的空间。

4. 分代算法分代算法是针对对象的生命周期不同而提出的。

一般来说,对象的生命周期可以分为年轻代和老年代。

年轻代中的对象生命周期较短,老年代中的对象生命周期较长。

分代算法将堆分为年轻代和老年代两个区域,分别采用不同的垃圾回收算法。

年轻代一般使用复制算法,老年代一般使用标记-清除算法或标记-整理算法。

三、GC的执行过程1. 初始标记初始标记阶段是GC的第一步,它的目的是标记出所有的根对象,并且停止所有的应用线程。

这个过程是短暂的,因为只需要标记出与根对象直接关联的对象。

2. 并发标记并发标记阶段是GC的核心步骤,它的目的是通过并发执行来标记出所有的存活对象。

在这个阶段,GC会遍历整个堆,标记出与根对象直接或间接关联的存活对象。

JVM的内存管理机制详解

JVM的内存管理机制详解

JVM的内存管理机制详解JVM是Java虚拟机的缩写,它是Java程序的运行环境。

JVM的内存管理机制是其核心功能之一,它负责管理Java程序的内存分配和回收,包括对象的创建、使用和销毁等。

JVM的内存管理机制主要由堆、栈和方法区组成。

堆是Java程序运行时的动态数据区,用来存储对象实例和数组。

栈是每个线程私有的,用来存储局部变量、方法参数和运算数据等。

方法区是存储类信息、常量、静态变量和编译器优化后的代码等。

堆是Java程序最大的内存区域,被所有线程共享。

在JVM启动时,会预设一个初始大小,但它可以动态地扩展或收缩。

堆内存由年轻代和老年代组成。

年轻代分为Eden区和两个Survivor区(名为S0和S1)。

当新对象被创建时,它们会被放在Eden区。

当Eden区满时,会触发垃圾回收,把不再被引用的对象回收掉,而仍然存活的对象会被移动到Survivor区。

经过多次垃圾回收后仍然存活的对象会被移动到老年代。

老年代中的对象会比较稳定,一般不会被频繁回收。

栈是线程私有的,用于存储局部变量、方法参数和运算数据等。

栈的大小是固定的,由编译器预先确定,并在线程创建时分配。

每个栈帧由局部变量表、操作数栈、动态链接和方法出口等组成。

当方法被调用时,JVM会为该方法创建一个栈帧,当方法返回时,栈帧就会被销毁。

栈帧的销毁顺序和创建顺序相反,即最后创建的栈帧最先销毁。

方法区是线程共享的,用于存储类信息、常量、静态变量和编译器优化后的代码等。

方法区大小是固定的,通常比堆小。

在方法区中,类的信息会一直保存,直到JVM退出。

方法区还包括运行时常量池,用来存储编译期生成的字面量和符号引用。

符号引用是对类、字段和方法的符号引用,如类或方法的全限定名。

字面量是Java程序中的常量,如字符串、整数和浮点数等。

在JVM中,内存的分配和回收是通过垃圾回收器(GC)来完成的。

GC会定期地检查堆中的对象,将不再被引用的对象回收掉,释放内存空间。

jvm内存管理机制

jvm内存管理机制

jvm内存管理机制Java虚拟机(JVM)是一种用于Java程序执行的虚拟机。

JVM内存管理机制是确保Java程序顺利执行的重要基础。

在本文中,我们将通过以下步骤详细介绍JVM内存管理机制。

第一步:JVM内存模型JVM内存模型是JVM用于管理内存的核心。

JVM内存模型可分为线程栈、堆以及方法区(也称为永久区)。

线程栈用于存储线程执行时的栈帧,每个栈帧包含方法调用信息、局部变量以及操作数栈。

堆是Java程序中所有对象的存储区域,其中包括数组以及对象。

方法区用于存储类的信息、方法信息以及静态变量。

第二步:JVM内存分配JVM内存分配可分为对象分配、栈帧分配以及类信息分配。

对象分配是在堆中分配内存以存储对象的过程。

栈帧分配是在每个线程栈中分配内存以存储栈帧的过程。

类信息分配是在方法区中分配内存以存储类信息、方法信息以及静态变量。

第三步:JVM内存回收JVM内存回收是确保Java程序获得足够内存的重要机制。

JVM内置垃圾回收器用于回收无用对象占用的内存。

JVM垃圾回收器可分为串行垃圾回收器、并行垃圾回收器以及CMS垃圾回收器。

串行垃圾回收器是一种单线程回收器,用于小型应用程序;并行垃圾回收器是一种多线程回收器,用于大型应用程序;CMS垃圾回收器是一种以最小停顿时间为目标的垃圾回收器,用于大型应用程序。

第四步:JVM性能调优JVM内存管理机制对Java程序的性能有着至关重要的影响。

JVM 性能调优是确保Java程序最佳性能的重要手段。

JVM性能调优可分为如下几个方面:1. 内存设置:内存设置决定了JVM所使用的最大内存以及初始内存大小。

2. GC设置:GC设置包括选择合适的垃圾回收器以及调整垃圾回收器参数。

3. 线程设置:线程设置包括调整线程池大小以及线程优先级等。

4. 类加载设置:类加载设置包括调整类加载路径以加快类加载速度。

5. 程序代码优化:程序代码优化可通过使用缓存、避免重复计算以及使用合适的算法等手段来提高程序性能。

Java的GC工作原理

Java的GC工作原理

GC的基本‎原理‎Java‎的内存管理‎实际上就是‎对象的管理‎,其中包括‎对象的分配‎和释放。

‎对‎于程序员来‎说,分配对‎象使用ne‎w关键字;‎释放对象时‎,只要将对‎象所有引用‎赋值为nu‎l l,让程‎序不能够再‎访问到这个‎对象,我们‎称该对象‎为"不可达‎的".GC‎将负责回收‎所有"不可‎达"对象的‎内存空间。

‎对‎于GC来说‎,当程序员‎创建对象时‎,GC就开‎始监控这个‎对象的地‎址、大小以‎及使用情况‎。

通常,G‎C采用有向‎图的方式记‎录和管理堆‎(heap‎)中的所有‎对象(详见‎参考资料1‎)。

通过这‎种方式确定‎哪些对象是‎"可达的"‎,哪些对‎象是"不可‎达的".当‎G C确定一‎些对象为"‎不可达"时‎,GC就有‎责任回收这‎些内存空间‎。

但是,为‎了保证GC‎能够在不同‎平台实现的‎问题,Ja‎v a规范‎对GC的很‎多行为都没‎有进行严格‎的规定。

例‎如,对于采‎用什么类型‎的回收算法‎、什么时候‎进行回收等‎重要问题都‎没有明确的‎规定。

因此‎,不同的J‎V M的实现‎者往往有‎不同的实现‎算法。

这也‎给Java‎程序员的开‎发带来行多‎不确定性。

‎本文研究了‎几个与GC‎工作相关的‎问题,努力‎减少这种不‎确定性给J‎a va程序‎带来的负面‎影响。

‎增量式G‎C(Inc‎r emen‎t alGC‎)‎G C在JV‎M中通常是‎由一个或一‎组进程来实‎现的,它本‎身也和用户‎程序一样占‎用heap‎空间,运行‎时也占用C‎P U.当G‎C进程运行‎时,应用程‎序停止运行‎。

因此,‎当GC运行‎时间较长时‎,用户能够‎感到Jav‎a程序的停‎顿,另外一‎方面,如果‎G C运行时‎间太短,则‎可能对象回‎收率太低,‎这意味着还‎有很多应该‎回收的对‎象没有被回‎收,仍然占‎用大量内存‎。

JVM内存区域(Java内存区域)、JVM垃圾回收机制(GC)初探

JVM内存区域(Java内存区域)、JVM垃圾回收机制(GC)初探

JVM内存区域(Java内存区域)、JVM垃圾回收机制(GC)初探⼀、JVM内存区域(Java内存区域) ⾸先区分⼀下JVM内存区域(Java内存区域)和Java内存模型(JMM)的概念。

Java线程之间的通信采⽤的是共享内存模型,这⾥提到的共享内存模型指的就是Java内存模型(简称JMM),Java内存模型(即Java Memory Model,简称JMM)本⾝是⼀种抽象的概念,并不真实存在;Java线程之间的通信由JMM控制,JMM决定⼀个线程对共享变量的写⼊何时对另⼀个线程可见。

⽽JVM内存区域,有的地⽅也称之为Java内存区域,是JVM对JMM的实现。

在JVM内部,Java内存模型把内存分成了两部分:线程栈区和堆区,也可以理解为线程共享内存区和线程私有内存区。

接下来就具体介绍分析⼀下JVM内存区域。

Java程序是交由JVM执⾏的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。

在讨论JVM内存区域划分之前,先来看⼀下Java程序具体执⾏的过程: 从图中可以看到,JVM主要由三⼤部分组成:类加载器、执⾏引擎、运⾏时数据区。

本篇博客主要介绍运⾏时数据区部分,类加载器会后续单独在⼀篇博客中介绍。

如上图所⽰,⾸先Java源代码⽂件(.java后缀)会被Java编译器编译为字节码⽂件(.class后缀),然后由JVM中的类加载器中的defineClass()⽅法加载各个类的字节码⽂件进jvm内存中,⽣成ng.Class对象,每个类在JVM中都拥有⼀个对应的ng.Class 对象,并存放于运⾏时数据区(Runtime Data Area)的堆中,它提供了类结构信息的描述。

数组、枚举及基本Java类型(如int、double等)甚⾄void都拥有对应的Class对象。

这也就是我们常说的Java类的静态加载,即程序在运⾏时,所需要的类就必须加载好,如果编译时这个类的.class⽂件不存在,程序将编译出错⽆法运⾏;还有⼀种是动态加载是通过反射机制在运⾏时⽤Class.forName()加载字节码⽂件获得ng.Class对象并放到JVM内存中。

jvm-gc

jvm-gc

JVM的相关知识是学习java高级特性必须要去深入学习的。

平时也有一些学习和实践,不过总结比较少。

今天有时间总结一下最基础的内存模型和GC策略的知识,在此记录一下。

hotspot jvm内存模型1.内存模型hotspot的内存模型很多地方都有类似总结,我也简单总结了一下,大概可以用下图表示:关于几个分区的描述定义1.线程栈:线程创建是会为每个线程创建一个线程栈,线程栈里面会为每个方法调用创建一个栈帧。

主要用于保存线程的当前运行状态。

2.堆:用于存放运行时中生成的新对像。

会划分成新生代和老年代。

新生代里面又划分成了eden区、存活1区和存活2区。

3.永久区:方法和常量区,用于存放方法字节码元数据和各种常量。

为什么堆会划分为新生代和老年代?基本原理:对于大部分应用,常驻对象不多。

因为大部分存活寿命不长,新生代和老年代的划分有利于区分对待和缩小垃圾回收范围。

(Most allocated objects are not referenced (considered live) for long, that is, they die young. Few references from older to younger objects exist.)2.内存相关启动参数内存相关常见jvm参数参数含义-Xms 最小堆空间-Xmx 最大堆空间-Xmn 新生代空间-Xss 线程栈空间-XX:PermSize=xxx 永久代空间-XX:MaxPermSize=xxx 最大永久代空间-XX:SurviorRatio=xxx 代表eden:s0的比例-XX:NewRatio=xx 新生代和旧生代的比例.-XX:MaxTenuringThreshold。

在新生代最大存活次数hotspot 内存垃圾回收策略总结1.内存回收策略和常见概念常见内存回收策略可以从以下几个维度来理解:1.1 串行&并行串行:单线程执行内存回收工作。

JVM的四种GC算法

JVM的四种GC算法

JVM的四种GC算法JVM(Java Virtual Machine)是一种用于执行Java字节码的虚拟机,它负责管理和运行Java应用程序。

在JVM中,垃圾回收(Garbage Collection,GC)是一项重要的功能,用于自动回收不再使用的内存对象,以避免内存泄漏和垃圾堆积。

JVM提供了多种GC算法,每种算法都有其独特的优缺点,适用于不同的场景和需求。

下面将介绍JVM的四种主要的GC算法。

1. 标记-清除算法(Mark-Sweep Algorithm):标记-清除算法是最基本的GC算法,它分为两个阶段。

首先,标记阶段会从根对象开始,标记所有被引用的对象。

然后,在清除阶段,未被标记的对象将被回收,回收的内存空间将被添加到可用的内存池中。

虽然这种算法能够回收没有引用的对象,但它有两个主要的问题:1)标记和清除过程需要暂停应用程序的执行,导致系统的停顿时间较长;2)清除后的内存空间可能会产生碎片,使得分配大对象变得困难。

2. 复制算法(Copying Algorithm):复制算法是基于将可用内存空间划分为两个相等的区域的思想。

在垃圾回收过程中,将存活的对象从一个区域复制到另一个区域,然后清空原来的区域。

这样做的好处是避免了内存碎片的问题,但同时也会浪费一半的内存空间。

所以,复制算法通常用于应用程序使用的内存空间较小的情况下。

标记-压缩算法是一种改进的标记-清除算法,它在清除阶段除了回收未被标记的对象外,还会将存活的对象压缩到内存的一端。

这样做的好处是可以解决标记-清除算法产生的内存碎片问题。

然而,与标记-清除算法类似,这种算法也会导致系统停顿时间较长。

4. 分代算法(Generational Algorithm):分代算法是一种基于对象存活时间不同的假设的算法。

根据经验观察,大部分对象在内存中的生命周期很短,而只有少部分对象会长时间存在。

基于这个观察,分代算法将内存分为多个代,通常是年轻代和老年代。

javagc的工作机制

javagc的工作机制

javagc的工作机制Java的垃圾回收(Garbage Collection,简称GC)是Java语言中的一种自动内存管理机制,它主要负责回收程序中不再使用的对象,释放它们所占用的内存资源,以提高系统的性能和效率。

Java的GC工作机制可以理解为一个自动的垃圾收集器,它负责监控程序中的内存使用情况,并在必要时回收不再使用的对象。

Java 的垃圾回收是基于可达性分析算法的,即通过判断对象是否可达来确定其是否需要被回收。

在Java中,每当创建一个新的对象时,Java虚拟机(JVM)会为其分配一块内存空间。

当这个对象不再被程序引用时,就成为了垃圾,垃圾回收机制会在合适的时机将其回收并释放内存空间。

为了确定一个对象是否可达,GC会从一组称为“根”的对象开始遍历,然后根据引用关系遍历整个对象图,标记所有可达的对象。

未被标记的对象即为不可达对象,将会被回收。

垃圾回收的触发时机是由Java虚拟机决定的,一般情况下,当系统的内存占用达到一定阈值时,垃圾回收机制就会被触发。

在进行垃圾回收时,Java虚拟机会暂停程序的执行,然后扫描整个堆内存,标记并回收不可达对象。

这个过程被称为“Stop-The-World”,会导致一段时间的系统停顿,对于实时性要求较高的应用可能会产生影响。

为了避免过多的垃圾回收,Java提供了不同的垃圾回收器,可以根据应用的需求选择合适的回收器。

常见的垃圾回收算法有标记-清除算法、复制算法、标记-整理算法等。

不同的垃圾回收器有不同的特点和适用场景,比如Serial收集器适用于小型应用,Parallel收集器适用于多核心处理器,CMS收集器适用于低延迟应用等。

除了选择合适的垃圾回收器,开发人员还可以通过一些手段来优化垃圾回收的性能。

比如,可以通过减少对象的创建和销毁次数,避免产生过多的临时对象;可以通过合理设置堆内存大小和垃圾回收的阈值,以减少垃圾回收的频率和停顿时间;还可以通过手动调用System.gc()方法来建议垃圾回收机制执行回收操作。

JVM的内存管理机制详解

JVM的内存管理机制详解

JVM的内存管理机制详解JVM(Java Virtual Machine)是Java编程语言的基础,它允许Java应用程序在不同的操作系统上运行。

JVM负责将Java字节码翻译成机器可执行的指令,并管理Java应用程序的内存。

JVM的内存管理机制包括垃圾回收、内存分配和内存优化等方面。

下面将详细介绍JVM的内存管理机制。

1. 堆内存(Heap Memory):堆内存是JVM中最大的一块内存区域,用于存储对象实例。

我们创建的所有对象都存放在这个区域中。

堆内存由新生代和老年代组成。

新生代又分为Eden区和两个Survivor区,用于存放新创建的对象,而老年代存放存活时间较长的对象。

2. 栈内存(Stack Memory):栈内存用于存储Java方法的局部变量、方法参数和临时变量。

每个线程在执行方法的时候都会创建一个栈帧,栈帧包含了方法的局部变量和操作数栈。

栈帧的大小在方法编译时就确定了,因此栈内存的分配和回收是非常快速和高效的。

3. 方法区(Method Area):方法区用于存储已加载的类信息、常量、静态变量和编译后的代码等数据。

方法区在JVM启动时被创建,并且在JVM关闭时销毁。

方法区中存放的数据是共享的,所有线程共享同一块方法区内存。

4. 本地方法栈(Native Method Stack):本地方法栈用于存储Java应用程序调用本地方法的相关信息。

本地方法栈和栈内存的作用类似,不同之处在于本地方法栈存储的是本地方法调用相关的数据。

5. PC寄存器(Program Counter Register):PC寄存器用于存储当前线程执行的字节码指令地址。

每个线程都有独立的PC寄存器,用于控制线程的执行。

6. 垃圾回收(Garbage Collection):垃圾回收是JVM的一个重要特性,用于自动回收不再使用的对象和释放内存空间。

JVM中的垃圾回收器会定期扫描堆内存,将不再使用的对象标记为垃圾,并进行回收。

深入理解JVM-内存模型(jmm)和GC

深入理解JVM-内存模型(jmm)和GC

深⼊理解JVM-内存模型(jmm)和GC1.Java内存区域Java程序内存的分配是在JVM虚拟机内存分配机制下完成。

Java内存模型(Java Memory其中⽅法区和堆是所有线程共享的,栈,本地⽅法栈和程序虚拟机则为线程私有的。

Model ,JMM)就是⼀种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果⼀致的机制及规范2.1 五⼤内存区域2.1.1 程序计数器程序计数器是⼀块很⼩的内存空间,它是线程私有的,可以认作为当前线程的⾏号指⽰器。

为什么需要程序计数器我们知道对于⼀个处理器(如果是多核cpu那就是⼀核),在⼀个确定的时刻都只会执⾏⼀条线程中的指令,⼀条线程中有多个指令,为了线程切换可以恢复到正确执⾏位置,每个线程都需有独⽴的⼀个程序计数器,不同线程之间的程序计数器互不影响,独⽴存储。

注意:如果线程执⾏的是个java⽅法,那么计数器记录虚拟机字节码指令的地址。

如果为native【底层⽅法】,那么计数器为空。

这块内存区域是虚拟机规范中唯⼀没有OutOfMemoryError的区域。

2.1.2 Java栈(虚拟机栈)同计数器也为线程私有,⽣命周期与相同,就是我们平时说的栈,栈描述的是Java⽅法执⾏的内存模型。

每个⽅法被执⾏的时候都会创建⼀个栈帧⽤于存储局部变量表,操作栈,动态链接,⽅法出⼝等信息。

每⼀个⽅法被调⽤的过程就对应⼀个栈帧在虚拟机栈中从⼊栈到出栈的过程。

【栈先进后出,下图栈1先进最后出来】对于栈帧的解释参考栈帧: 是⽤来存储数据和部分过程结果的数据结构。

栈帧的位置: 内存 -> 运⾏时数据区 -> 某个线程对应的虚拟机栈 -> here[在这⾥]栈帧⼤⼩确定时间: 编译期确定,不受运⾏期数据影响。

通常有⼈将java内存区分为栈和堆,实际上java内存⽐这复杂,这么区分可能是因为我们最关注,与对象内存分配关系最密切的是这两个。

JVM知识(四):GC配置参数

JVM知识(四):GC配置参数

JVM知识(四):GC配置参数 JVM配置参数分为三类参数:跟踪参数、堆分配参数、栈分配参数 这三类参数分别⽤于跟踪监控JVM状态,分配堆内存以及分配栈内存。

跟踪参数 跟踪参数⽤户跟踪监控JVM,往往被开发⼈员⽤于JVM调优以及故障排查。

1、当发⽣GC时,打印GC简要信息 使⽤-XX:+PrintGC或-verbose:gc参数 这两个配置参数效果是⼀样的,都是在发⽣GC时打印出简要的信息,例如:public static void main(String[] args) {byte[] bytes =null;for(int i=0;i<100;i++){bytes = new byte[1 * 1024 * 1024];}}这个程序连续创建了100个1M的数组对象,使⽤-XX:+PrintGC或-verbose:gc参数执⾏该程序,即可查看到GC情况: 1: [GC (Allocation Failure) 32686K->1648K(123904K), 0.0007230 secs] 2: [GC (Allocation Failure) 34034K->1600K(123904K), 0.0009652 secs] 3: [GC (Allocation Failure) 33980K->1632K(123904K), 0.0005306 secs]我们可以看到程序执⾏了3次GC(minor GC),这三次GC都是新⽣代的GC,(新⽣代GC的解释)因为这个程序每次创建新的数组对象,都会把新的对象赋给bytes变量,⽽⽼的对象没有任意对象引⽤它,⽼对象会变的不可达,这些不可达的⽼对象在新⽣代minor GC时候被回收掉。

总结新⽣代GC:新⽣代GC回收⼀些不可达(没有任意对象引⽤)的⽼对象32686K表⽰回收前,对象占⽤空间。

1648K表⽰回收后,对象占⽤空间。

123904K表⽰还有多少空间可⽤。

java gc 原理

java gc 原理

java gc 原理
Java中的垃圾回收(Garbage Collection,简称GC)机制是自
动管理内存的一个重要特性。

在Java程序中,内存的分配和
释放由Java虚拟机(JVM)自动完成,开发人员不需要手动
进行内存的申请和释放。

在运行过程中,JVM会自动监测对
象的存活状态,并周期性地回收不再被引用的对象所占用的内存空间。

Java的垃圾回收机制使用的是基于追踪回收的算法。

该算法将所有的对象视为图的节点,通过对象之间的引用关系构成有向图。

在对象不再被引用时,垃圾回收器会通过遍历对象之间的引用关系,标记出所有存活的对象。

然后,垃圾回收器会清理掉未被标记的对象,释放它们所占用的内存空间。

在Java中,垃圾回收器有多种实现方式,包括标记-清除算法、复制算法、标记-整理算法等。

这些算法的选择取决于应用程
序的特点和性能需求。

不同的垃圾回收器可以并行、串行或并发地进行垃圾回收操作,以提高整体性能和响应速度。

垃圾回收机制的优点是可以避免内存泄漏和野指针等常见的内存管理问题,提高了程序的安全性和稳定性。

然而,垃圾回收机制也存在一些性能上的开销。

在执行垃圾回收操作时,需要消耗一定的CPU和内存资源,可能会对应用程序的性能产生
一定的影响。

因此,在开发Java应用程序时,需要权衡好内
存使用效率和垃圾回收的开销,以达到良好的性能和用户体验。

JVM的内存管理机制

JVM的内存管理机制

JVM的内存管理机制JVM(Java Virtual Machine)是Java语言的运行环境,负责Java 程序的解释执行。

在运行Java程序时,JVM需要占用一定的内存空间,用于存储程序的运行时数据和执行过程中的临时数据。

JVM的内存管理机制主要包括内存划分和垃圾回收两个方面。

下面将详细介绍JVM的内存管理机制。

1.内存划分JVM将整个内存空间划分为多个不同的区域,每个区域负责存储不同类型的数据。

主要的内存区域包括:- 程序计数器(Program Counter Register):用于记录当前线程执行的字节码指令的地址。

- 虚拟机栈(VM Stack):每个线程在运行时,对应一个虚拟机栈,用于存储方法的调用栈帧、局部变量和运算中间结果等。

- 本地方法栈(Native Method Stack):与虚拟机栈类似,但用于执行本地方法的栈。

- 堆(Heap):用于存储对象实例和数组等动态分配的内存空间。

堆是所有线程共享的最大内存区域。

- 方法区(Method Area):用于存储类的信息、静态变量、常量、方法等。

方法区也是所有线程共享的最大内存区域。

2.垃圾回收在JVM的内存管理机制中,垃圾回收是一个重要的环节。

垃圾回收的主要目标是自动释放不再使用的内存空间,以便为新对象分配空间,提高内存的利用效率。

JVM通过垃圾收集器(Garbage Collector)实现垃圾回收功能。

垃圾收集器会根据一定的策略,定期扫描堆内存中的对象,标记出不再使用的对象,并将其回收。

垃圾回收可以通过不同的算法和组件来实现,主要的算法包括:- 标记-清除算法(Mark-Sweep):该算法通过标记对象,然后清除标记的对象,并回收其内存空间。

- 复制算法(Copying):该算法将内存分为两个大小相同的区域,每次只使用其中一个区域,当该区域满后,将存活的对象复制到另一个区域中,然后清除当前区域。

JVM还提供了不同的垃圾收集器组合,以满足不同场景下的需求。

jvm中一次完整的gc流程

jvm中一次完整的gc流程

jvm中一次完整的gc流程在JVM中,垃圾回收是一项非常重要的功能。

它负责回收不再使用的内存,以便程序可以继续使用。

一次完整的GC流程包括以下几个步骤:1. 标记阶段:在这个阶段,垃圾回收器会遍历整个堆,标记所有仍然被引用的对象。

一般情况下,垃圾回收器会从根对象开始遍历,然后递归地遍历它们引用的对象,直到遍历到所有的对象。

2. 筛选阶段:在标记阶段完成后,垃圾回收器会筛选出所有未被标记的对象,并将它们作为垃圾对象进行回收。

这个过程通常被称为“Sweeping”。

3. 整理阶段:在筛选阶段完成后,堆空间中通常会留下一些不连续的内存块。

为了使堆空间尽可能地连续,垃圾回收器会进行内存整理,将所有存活的对象移到堆空间的一端。

这个过程通常被称为“Compact”。

以上三个阶段构成了一次完整的GC流程。

在实际应用中,JVM 通常会使用不同的垃圾回收算法来完成这个流程。

常见的垃圾回收算法包括:1. 标记-清除算法:这个算法会在标记阶段标记不再使用的对象,然后在筛选阶段将它们清除掉。

这个算法的缺点是会产生内存碎片,降低堆效率。

2. 标记-整理算法:这个算法会在标记阶段标记不再使用的对象,然后在整理阶段将所有存活的对象移到一端,清除掉另一端的垃圾对象。

这个算法可以避免内存碎片,但是需要移动存活对象,对性能有一定的影响。

3. 复制算法:这个算法会将堆空间分成两个区域,每次只使用其中一个区域,当这个区域用完后,将所有存活的对象复制到另一个区域中,然后清除原来的区域。

这个算法可以避免内存碎片,但是需要耗费一半的堆空间。

总之,在使用JVM的过程中,垃圾回收是一个不可忽视的问题。

了解垃圾回收的原理和流程,可以帮助我们正确地使用内存,提高程序的性能和稳定性。

javagc算法及其原理

javagc算法及其原理

javagc算法及其原理Java的垃圾回收机制(GC)是一个自动管理内存的机制,它能够自动扫描内存中的对象,释放那些不再被使用的对象的内存空间,从而保证程序运行的正确性和效率。

GC算法的原理是通过观察对象的引用,给每个对象打上标记,然后根据这些标记,判断哪些对象可以被回收,哪些对象应该保留,然后将未被标记的对象回收掉。

这个过程可以采用不同的算法来实现,一般来说,一个优秀的GC算法应该满足以下几个条件:1、高效性:GC算法需要在尽可能短的时间内回收最多的垃圾2、可预测性:GC算法应该能够在不同的场景下运行,并且在不同的情况下实现可预测的回收效果3、低延迟:GC算法应该能够尽可能地减少系统的暂停时间,确保程序的运行效率4、低内存消耗:GC算法需要尽量减少对系统内存的占用,并且满足各种内存限制条件Java中常用的GC算法有以下几种:1、标记-清除算法:这是最基本的GC算法。

其原理是首先标记那些对象不再使用,然后清除这些对象所占用的内存空间。

但是这种算法在实际运用中存在很多问题,如效率低下、存在内存碎片等。

2、复制算法:这种算法将内存空间分为两部分,一部分为使用中的对象,另一部分为空闲的空间。

首先将使用中的对象复制到闲置的内存中去,然后清除原有的内存中的对象。

这种算法的优点是效率高,缺点是需要大量的内存空间。

3、标记-整理算法:这种算法可以克服标记-清除算法的缺点,它先标记出所有不再使用的对象,然后将剩余的对象整理到内存的一端,释放出其他空间。

4、分代算法:这种算法将内存分为新生代和老年代两个部分,大部分对象都在新生代中创建。

每次GC时,首先回收新生代中不再使用的对象,如果对象达到一定的老化阈值,则将其移动到老年代中,并在老年代中进行GC。

综上所述,GC算法的选择取决于应用程序的性质和运行环境。

在实际开发中,需要针对具体的应用场景和性能要求进行分析和选择。

【转载】Java性能优化之JVMGC(垃圾回收机制)

【转载】Java性能优化之JVMGC(垃圾回收机制)

【转载】Java性能优化之JVMGC(垃圾回收机制)⽂章来源:https:///p/25539690Java的性能优化,整理出⼀篇⽂章,供以后温故知新。

JVM GC(垃圾回收机制)在学习Java GC 之前,我们需要记住⼀个单词:stop-the-world 。

它会在任何⼀种GC算法中发⽣。

stop-the-world 意味着JVM因为需要执⾏GC⽽停⽌了应⽤程序的执⾏。

当stop-the-world 发⽣时,除GC所需的线程外,所有的线程都进⼊等待状态,直到GC任务完成。

GC优化很多时候就是减少stop-the-world 的发⽣。

JVM GC回收哪个区域内的垃圾?需要注意的是,JVM GC只回收堆区和⽅法区内的对象。

⽽栈区的数据,在超出作⽤域后会被JVM⾃动释放掉,所以其不在JVM GC的管理范围内。

JVM GC怎么判断对象可以被回收了?· 对象没有引⽤· 作⽤域发⽣未捕获异常· 程序在作⽤域正常执⾏完毕· 程序执⾏了System.exit()· 程序发⽣意外终⽌(被杀线程等)在Java程序中不能显式的分配和注销缓存,因为这些事情JVM都帮我们做了,那就是GC。

有些时候我们可以将相关的对象设置成null 来试图显⽰的清除缓存,但是并不是设置为null 就会⼀定被标记为可回收,有可能会发⽣逃逸。

将对象设置成null ⾄少没有什么坏处,但是使⽤System.gc() 便不可取了,使⽤System.gc() 时候并不是马上执⾏GC操作,⽽是会等待⼀段时间,甚⾄不执⾏,⽽且System.gc() 如果被执⾏,会触发Full GC ,这⾮常影响性能。

JVM GC什么时候执⾏?eden区空间不够存放新对象的时候,执⾏Minro GC。

升到⽼年代的对象⼤于⽼年代剩余空间的时候执⾏Full GC,或者⼩于的时候被HandlePromotionFailure 参数强制Full GC 。

Java内存管理以及GC工作原理

Java内存管理以及GC工作原理

年轻代大小选择o响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。

在此种情况下,年轻代收集发生的频率也是最小的。

同时,减少到达年老代的对象。

o吞吐量优先的应用:尽可能的设置大,可能到达Gbit的程度。

因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。

年老代大小选择o响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。

如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。

最优化的方案,一般需要参考以下数据获得:▪并发垃圾收集信息▪持久代并发收集次数▪传统GC信息▪花在年轻代和年老代回收上的时间比例o减少年轻代和年老代花费的时间,一般会提高应用的效率o吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。

原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象。

1较小堆引起的碎片问题因为年老代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。

当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象。

但是,当堆空间较小时,运行一段时间以后,就会出现“碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记、清除方式进行回收。

如果出现“碎片”,可能需要进行如下配置:o-XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩。

o-XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩2JVM给了三种选择:串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。

jvm gc运行原理

jvm gc运行原理

jvm gc运行原理一、概述JVM(Java虚拟机)的垃圾回收(GC)是Java程序运行过程中非常重要的一部分。

GC用于自动管理内存,当对象不再被使用时,GC会自动回收这些对象的内存,以防止内存泄漏。

本文将详细介绍JVMGC的运行原理。

二、GC算法1.标记-清除(Mark-Sweep):这是最基础的GC算法,它首先标记出所有需要回收的对象,然后清理未被标记的对象。

但是,这种算法无法处理内存碎片化问题,可能导致某些小对象无法被回收。

2.复制(Copy):复制算法将内存分为两个区域,同时使用这两个区域。

当一个区域使用完毕后,将其标记为垃圾,然后将其复制到另一个区域中。

这种算法能够避免内存碎片化问题,但是需要双倍的内存空间。

3.标记-整理(Mark-Compact):标记-整理算法是在标记-清除算法的基础上,通过将所有需要回收的对象移动到内存的一端,从而避免内存碎片化问题。

4.分代收集(GenerationalGC):分代收集算法将内存分为年轻代和老年代。

年轻代中的对象存活时间较短,而老年代中的对象存活时间较长。

这种算法能够根据对象的存活时间进行不同的处理,从而提高GC效率。

三、GC工作流程GC工作流程大致可以分为以下几个步骤:1.开始:GC开始运行,系统进入GC阶段。

2.扫描:GC会遍历所有对象,标记出需要回收的对象。

这个过程通常需要花费较多的时间。

3.清理:在扫描完成后,GC会清理未被标记的对象,包括释放内存等操作。

4.结束:GC完成后,系统重新回到正常运行状态。

四、GC优化GC优化是提高Java程序性能的重要手段之一。

以下是一些常见的GC优化技巧:1.使用合适大小的堆内存:根据程序的需求选择合适的堆内存大小,避免过大或过小。

2.启用年轻代GC:推荐使用年轻代GC算法(如复制或标记-整理),以提高年轻代对象的回收效率。

3.调整垃圾收集器参数:可以通过调整垃圾收集器的参数来优化GC性能,如垃圾收集周期、暂停时间等。

java gc工作原理

java gc工作原理

java gc工作原理博客分类:j2seJava工作数据结构算法JVMGC基本工作原理:java内存的管理是对象的管理,就是对象的内存的分配和释放;分配对象:一般情况使用new ,或使用类加载器ClassLoader ;释放对象:将对象的所有引用赋值为null ,让程序不可访问该对象,该对象”不可达“,gc 将回收所有不可达对象。

对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。

通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象增量式GC( Incremental GC )GC在JVM中通常是由一个或一组进程来实现的,它本身也和用户程序一样占用heap空间,运行时也占用CPU.当GC进程运行时,应用程序停止运行。

因此,当GC运行时间较长时,用户能够感到 Java程序的停顿,另外一方面,如果GC 运行时间太短,则可能对象回收率太低,这意味着还有很多应该回收的对象没有被回收,仍然占用大量内存。

详解finalize方法:finalize方法属于Object类中的方法,其修饰符protected,所以所有类都可以访问该方法。

由于,finalize函数没有自动实现链式调用,我们必须手动的实现,因此finalize函数的最后一个语句通常是super.finalize()。

根据Java语言规范,JVM保证调用finalize函数之前,这个对象是不可达的,但是JVM不保证这个函数一定会被调用。

另外,规范还保证finalize函数最多运行一次。

通常,finalize用于一些不容易控制、并且非常重要资源的释放,例如一些I/O的操作,数据的连接。

这些资源的释放对整个应用程序是非常关键的。

在这种情况下,程序员应该以通过程序本身管理(包括释放)这些资源为主,以finalize函数释放资源方式为辅,形成一种双保险的管理机制,而不应该仅仅依靠finalize来释放资源。

程序如何与GC进行交互三种引用类分别为SoftReference、WeakReference和 PhantomReference.通过使用这些引用类,程序员可以在一定程度与GC进行交互,以便改善GC的工作效率。

JVM的三种常见GC:MinorGC、MajorGC与FullGC

JVM的三种常见GC:MinorGC、MajorGC与FullGC

JVM的三种常见GC:MinorGC、MajorGC与FullGC 文章目录••ooo▪▪▪oo▪JVM的GCGC:垃圾回收GC英文全称为Garbage Collection,即垃圾回收。

Java中的GC就是对内存的GC。

Java的内存管理实际上就是对象的管理,其中包括对象的分配和释放。

Java对象的分配,程序员可以通过new关键字,Class的new-Instance方法等来显示的分配;而对象的释放,程序员不能实时的进行释放,这就需要GC来完成。

JVM GC的种类JVM常见的GC包括三种:Minor GC,Major GC与Full GC针对HotSpot VM的实现,它里面的GC按照回收区域又分为两大种类型:•一种是部分收集(Partial GC)•一种是整堆收集(Full GC)部分收集(Partial GC):不是完整收集整个Java堆的垃圾收集,其中又分为:•新生代收集(Minor GC/Young GC):只是新生代的垃圾收集•老年代收集(Major GC/Old GC):只是老年代的垃圾收集•混合收集(Mixed GC):收集整个新生代以及部分老年代的垃圾收集,目前,只有G1 GC会有这种行为整堆收集(Full GC):收集整个Java堆和方法区的垃圾收集注意:JVM在进行GC时,并非每次都对所有区域(新生代,老年代,方法区)一起回收的,大部分时候回收的都是指新生代GC的触发机制年轻代GC(Minor GC)触发机制触发机制:•当年轻代空间不足时,就会触发Minor GC,这里的年轻代空间不足指的是Eden区满,Survivor区满不会触发GC(每次Minor GC 会清理年轻代的内存)因为Java对象大多具备朝生夕死的特新,所以Minor GC非常频繁,一般回收速度也比较快.Minor GC会引发STW,暂停其他用户线程,等垃圾回收结束,用户线程才恢复运行老年代GC(Major GC/Full GC)触发机制指发生在老年代的GC,对象从老年代消失时,我们说"Major GC 或Full GC"发生了、一般出现Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略里就有直接进行Major GC的策略选择过程)触发机制:•也就是老年代空间不足时,会先尝试触发Minor GC,如果之后空间还不足,则触发Major GCPS:Major GC的速度一般会比Minor GC慢10倍以上,STW的时间更长如果Major GC后,内存还不足,就报OOM了Major GC的速度一般会比Minor GC慢10倍以上Full GC触发机制触发Full GC执行的情况有如下五种:•调用System.gc(),系统建议执行Full GC,但是不必然执行•老年代空间不足•方法区空间不足•通过Minor GC后进入老年代的平均大小大于老年代的可用内存•由Eden区,from区向to区复制时,对象大小大于to区可用内存,则把对象转存到老年代,并且老年代的可用内存小于该对象大小(那要是GC之后还不够呢?那还用说:OOM异常送上)另外要特别注意: full GC是开发或调优中尽量要避免的为什么需要把Java堆分代?经研究,不同对象的生命周期不同,70%-99%的对象是临时对象其实不分代完全可以,分代的唯一理由就是优化GC性能,如果没有分代,那所有的对象都在一个区域,当需要进行GC的时候就需要把所有的对象都进行遍历,GC的时候会暂停用户线程,那么这样的话,就非常消耗性能,然而大部分对象都是朝生夕死的,何不把活得久的朝生夕死的对象进行分代呢,这样的话,只需要对这些朝生夕死的对象进行回收就行了.总之,容易死的区域频繁回收,不容易死的区域减少回收.扩展:分代回收机制的三个假说当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”(GenerationalCollection)[插图]的理论进行设计,分代收集名为理论,实质是一套符合大多数程序运行实际情况的经验法则,它建立在两个分代假说之上:1.弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕灭的。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JVM 内存管理与GC
• • • • • Hotspot JVM内存区域的组成及关系 各GC算法、策略的原理和优缺点 Hotspot JVM的各garbage collectors young GC/full GC/CMS GC的触发条件 GC调优方法
Page 1
Java 运行原理
A.java
Java编译器
GC的触发条件
Young GC (Minor GC)
当Eden的剩余空间丌足以满足内存分配要求时
Full GC(Major GC) old空间丌足 Perm空间丌足 CMS GC时出现promotion failed 或concurrent mode failure 统计得到的minor GC promotion size平均大小大于old区剩余空间 -Dsun.rmi.dgc.client.gcInterval(default 3600)
Page 8
Jvm自动内存管理
Automatic memory management,引入garbage collector – 给对象分配内存 – 回收分配给对象的内存 – 依然存在内存泄露的问题,但丌同于C/C++
garbage collection is a form of automatic memory management. the garbage collector attempt to reclaim garbage, or memory occupied by objects that are no longer in use by the program
Page 5
各内存区域之间的关系
• • • • •
每个java程序至少有一个线程(main线程),每一个线程有私有的java stack。每一次方法调用都会 在stack 中建立一个stack frame。每次方法调用从开始到执行完成的过程,对应着一个stack frame 在java stack中从入栈到出栈的过程。 每个stack frame有一个本地变量表,其中存的是基本数据类型和堆中对象的引用 java heap中存的是对象的实例数据 方法区(method area)中存的是对象的类型数据,包括方法、接口、静态字段(field) 方法区还包括常量池(constantpool)。 String.intern() Page 6
CMS
Old或perm的已使用空间达到设定的CMSInitiatingOccupancyFraction 自动触发 -XX:UseCMSInitiatingOccupancyOnly=true
Page 28
Full GC
当发生FULL GC时,所有代都会进行回收。一般来说,先采用年轻代的GC算 法回收年轻代,然后采用年老代的gc算法对年老代和永久代进行回收。但当 年老代剩余空间无法容纳从年轻代晋升的对象时,将采用年老代的gc算法对 整个heap进行回收 (但CMS 除外,因为CMS无法收集年轻代)
标记-整理
标记-整理算法是标记-清除算法和复制算法的结合。 回收前
回收后
优点:丌产生内存碎片,分配时快速 缺点:回收比较耗时
Page 17
Jvm分代回收
分代分配,分代回收 丌同代内的对象特点丌同,采用丌同的回收算法: 整理 vs 清除 vs 复制
串行 vs 幵行
幵发 vs 停顿 年轻代垃圾回收算法注重时间效率,因为minor gc比较频 繁,而年老代垃圾回收算法注重空间效率,
Page 3
Java 运行原理
A.java
Java编译器
A.class
• 加载、验证、准备、解析 • 刜始化、解释执行、编译执行
JVM
Page 4
Jvm规范-JVM内存组成
方法区 Method Area
运行时常量池 Runtime Constant Pool
虚拟机栈 VM Stack
本地方法栈 Native Method Stack
Байду номын сангаас
Scavenge gc
Page 21
年轻代parnew收集器
ParNew收集器除了多线程收集之外,其他不Serial收集器相比幵没有太 多创新之处,但它却是Server模式下首选的年轻代收集器,其中很重要 的原因是,除了Serial收集器外,目前只有它能不CMS收集器配合。
-XX:+UseParNewGC
Parallel Old
Page 26
JVM 内存管理与GC
• • • • • Hotspot JVM内存区域的组成和关系 各GC算法、策略的原理和优缺点 Hotspot JVM的各garbage collectors young GC/full GC/CMS GC的触发条件 GC调优方法
Page 27
复制算法需要一块未使用的 空间来存放live objects
• • Client-class(2C2G)或32位 windows机器上默认 -XX:+UseSerialGC
premature promotion!!
Page 20
年轻代parallel scavenge
也采用复制算法
• • •
Server-class(cpu核数超 过2且物理内存超过2GB) -XX:+UseParallelGC -XX:ParallelGCThreads
堆 Java Heap
程序计数寄存器 Program Counter Register
由所有线程共享的数据区
线程隔离的数据区
Direct memory,nio。JDK中的特例。 本机内存,malloc出来的内存,丌属于JVM管理,GC无法回收 Oci jdbc driver,Native heap 本机内存,malloc出来的内存,丌属于JVM管理,GC无法回收
Page 24
年老代CMS
本质上也是采用标记清除算法

四个阶段
initial-marking concurrent-marking Final marking(remarking) Concurrent sweeping

优点: 应用暂停时间短 缺点: GC总耗时比幵行GC长,GC吞吐量低
Page 13
GC 算法不策略
GC 算法(跟踪收集 VS 引用计数)
标记-清除(Mark-Sweep) 复制(Copying) 标记-整理(Mark-Compact)
GC 策略
• 串行(serial) • 幵行(parallel) • 幵发(concurrent)
Page 14
标记-清除
Page 29
JVM 内存管理与GC
• • • • • Hotspot JVM内存区域的组成和关系 各GC算法、策略的原理和优缺点 Hotspot JVM的各garbage collectors young GC/full GC/CMS GC的触发条件 GC调优方法
Page 30
调优哲学
throughput tradeoff
wikipedia
Page 9
JVM内存管理总体策略
分代
Page 10
对象分配
堆上分配(java heap)
分代(分区) 对象优先在eden区分配,或TLAB 大对象可直接分配在old区,-XX:PretenureSizeThreshold。此参数在年轻代采用 parallel scavenge GC时无效。 长期存活的对象将进入old区, -XX:MaxTenuringThreshold。如果对象在eden区创 建幵经过第一次minor gc后仍然存活,幵且能被survivor容纳的话,将被移到 survivor空间中,幵将对象年龄设为1。对象在survivor中每熬过一次minor gc,年 龄就增加一岁,当它的年龄增加到一定程度时,就会被晋升到old区。
pause time
Page 31
第一步:Estimate java heap size
A.class
• JVM指令集 • Bytecode(字节码) • 0x00—0xc9
Page 2
JVM
CLASS
ClassFile { u4 magic; //0xCAFEBABE u2 minor_version; u2 major_version; // jdk1.6 version:50 u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; u2 access_flags; u2 this_Class; u2 super_Class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count; field_info fields[fields_count]; u2 methods_count; method_info methods[methods_count]; //其中code属性存放该方法的字节码 u2 attributes_count; attribute_info attributes[attributes_count]; }
Hotspot JVM HEAP组成
方法区
• Hotspot JVM内存分为年轻代、年老代、永生 代 • Xmx, Xms, Xmn, • -XX:MaxPermSize • -XX:PermSize
Page 7
JVM 内存管理与GC
• • • • • Hotspot JVM内存区域的组成和关系 各GC算法、策略的原理和优缺点 Hotspot JVM的各garbage collectors young GC/full GC/CMS GC的触发条件 GC调优方法
相关文档
最新文档