技术分享-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是Java虚拟机的缩写,它是Java程序的运行环境。
JVM的内存管理机制是其核心功能之一,它负责管理Java程序的内存分配和回收,包括对象的创建、使用和销毁等。
JVM的内存管理机制主要由堆、栈和方法区组成。
堆是Java程序运行时的动态数据区,用来存储对象实例和数组。
栈是每个线程私有的,用来存储局部变量、方法参数和运算数据等。
方法区是存储类信息、常量、静态变量和编译器优化后的代码等。
堆是Java程序最大的内存区域,被所有线程共享。
在JVM启动时,会预设一个初始大小,但它可以动态地扩展或收缩。
堆内存由年轻代和老年代组成。
年轻代分为Eden区和两个Survivor区(名为S0和S1)。
当新对象被创建时,它们会被放在Eden区。
当Eden区满时,会触发垃圾回收,把不再被引用的对象回收掉,而仍然存活的对象会被移动到Survivor区。
经过多次垃圾回收后仍然存活的对象会被移动到老年代。
老年代中的对象会比较稳定,一般不会被频繁回收。
栈是线程私有的,用于存储局部变量、方法参数和运算数据等。
栈的大小是固定的,由编译器预先确定,并在线程创建时分配。
每个栈帧由局部变量表、操作数栈、动态链接和方法出口等组成。
当方法被调用时,JVM会为该方法创建一个栈帧,当方法返回时,栈帧就会被销毁。
栈帧的销毁顺序和创建顺序相反,即最后创建的栈帧最先销毁。
方法区是线程共享的,用于存储类信息、常量、静态变量和编译器优化后的代码等。
方法区大小是固定的,通常比堆小。
在方法区中,类的信息会一直保存,直到JVM退出。
方法区还包括运行时常量池,用来存储编译期生成的字面量和符号引用。
符号引用是对类、字段和方法的符号引用,如类或方法的全限定名。
字面量是Java程序中的常量,如字符串、整数和浮点数等。
在JVM中,内存的分配和回收是通过垃圾回收器(GC)来完成的。
GC会定期地检查堆中的对象,将不再被引用的对象回收掉,释放内存空间。
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工作原理

GC的基本原理Java的内存管理实际上就是对象的管理,其中包括对象的分配和释放。
对于程序员来说,分配对象使用new关键字;释放对象时,只要将对象所有引用赋值为nul l,让程序不能够再访问到这个对象,我们称该对象为"不可达的".GC将负责回收所有"不可达"对象的内存空间。
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。
通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象(详见参考资料1)。
通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的".当G C确定一些对象为"不可达"时,GC就有责任回收这些内存空间。
但是,为了保证GC能够在不同平台实现的问题,Jav a规范对GC的很多行为都没有进行严格的规定。
例如,对于采用什么类型的回收算法、什么时候进行回收等重要问题都没有明确的规定。
因此,不同的JV M的实现者往往有不同的实现算法。
这也给Java程序员的开发带来行多不确定性。
本文研究了几个与GC工作相关的问题,努力减少这种不确定性给Ja va程序带来的负面影响。
增量式GC(Incr ement alGC)G C在JVM中通常是由一个或一组进程来实现的,它本身也和用户程序一样占用heap空间,运行时也占用CP U.当GC进程运行时,应用程序停止运行。
因此,当GC运行时间较长时,用户能够感到Java程序的停顿,另外一方面,如果G C运行时间太短,则可能对象回收率太低,这意味着还有很多应该回收的对象没有被回收,仍然占用大量内存。
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的相关知识是学习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(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的工作机制Java的垃圾回收(Garbage Collection,简称GC)是Java语言中的一种自动内存管理机制,它主要负责回收程序中不再使用的对象,释放它们所占用的内存资源,以提高系统的性能和效率。
Java的GC工作机制可以理解为一个自动的垃圾收集器,它负责监控程序中的内存使用情况,并在必要时回收不再使用的对象。
Java 的垃圾回收是基于可达性分析算法的,即通过判断对象是否可达来确定其是否需要被回收。
在Java中,每当创建一个新的对象时,Java虚拟机(JVM)会为其分配一块内存空间。
当这个对象不再被程序引用时,就成为了垃圾,垃圾回收机制会在合适的时机将其回收并释放内存空间。
为了确定一个对象是否可达,GC会从一组称为“根”的对象开始遍历,然后根据引用关系遍历整个对象图,标记所有可达的对象。
未被标记的对象即为不可达对象,将会被回收。
垃圾回收的触发时机是由Java虚拟机决定的,一般情况下,当系统的内存占用达到一定阈值时,垃圾回收机制就会被触发。
在进行垃圾回收时,Java虚拟机会暂停程序的执行,然后扫描整个堆内存,标记并回收不可达对象。
这个过程被称为“Stop-The-World”,会导致一段时间的系统停顿,对于实时性要求较高的应用可能会产生影响。
为了避免过多的垃圾回收,Java提供了不同的垃圾回收器,可以根据应用的需求选择合适的回收器。
常见的垃圾回收算法有标记-清除算法、复制算法、标记-整理算法等。
不同的垃圾回收器有不同的特点和适用场景,比如Serial收集器适用于小型应用,Parallel收集器适用于多核心处理器,CMS收集器适用于低延迟应用等。
除了选择合适的垃圾回收器,开发人员还可以通过一些手段来优化垃圾回收的性能。
比如,可以通过减少对象的创建和销毁次数,避免产生过多的临时对象;可以通过合理设置堆内存大小和垃圾回收的阈值,以减少垃圾回收的频率和停顿时间;还可以通过手动调用System.gc()方法来建议垃圾回收机制执行回收操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• • • • • 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调优方法