1.JVM内存空间
JVM堆(Heap)= 新生代(Young) + 旧生代(Tenured)
分区作用:
新创建的对象通常先将其分配在新生代中,在新生代中经过若干次GC之后仍未释放的对象,再将它移动到旧生代。为了让内存回收更高效(GC会暂停JVM中的应用),Sun JDK在1.2开始对堆采用了分代管理的方式。在分配对象遇到内存不足时,先对新生代进行GC(Young GC);当新生代GC之后仍无法满足内存空间分配需求时, 才会对整个堆空间以及方法区进行GC (Full GC)
相关参数:
-Xms -- 设置堆内存初始大小
-Xmx -- 设置堆内存最大值
-XX:MaxTenuringThreshold -- 设置对象在新生代中存活的次数
-XX:PretenureSizeThreshold -- 设置超过指定大小的大对象直接分配在旧生代中
注意点:当新生代设置得太小时,也可能引发大对象直接分配到旧生代中。
新生代(Young)= Eden区 + Survivor区
分区作用:
Eden区为对象通常最初分配到的地方,Survivor区分为S0和S1两块大小相等的区域。JVM进行Minor GC时,将Eden中还存活的对象拷贝到Survivor区中,还会将Survivor区中还存活的对象拷贝到Tenured区中。在这种GC模式下,JVM为了提升GC效率, 将Survivor区分为S0和S1,这样就可以将对象回收和对象晋升分离开来。
相关参数:
-Xmn -- 设置新生代内存大小。
-XX:SurvivorRatio -- 设置Eden与Survivor空间的大小比例
注意点: 图中Virtual部分表示可伸缩的内存空间,当用-Xms在指定堆的初始大小为128m,通过-Xmx指定堆最大为256m时,JVM会根据内存情况在128m与256m之间伸缩。为了避免JVM进行这些伸缩消耗性能,对于能够提供稳定内存空间的用作服务器的JVM,通常将-Xms和-Xmx设置为相等。
方法区(Perm)
分区作用:
也被成为持久代,用来存放JVM加载的类型信息。包括: 类型基本信息,常量池,字段信息,方法信息,类变量,指向ClassLoader的引用,Class类的引用,方法表等。方法区是全局共享的,在一定条件下也会被GC。
相关参数:
-XX:PermSize --设置Perm区的初始大小
-XX:MaxPermSize --设置Perm区的最大值
JVM方法栈(注意:不是分区)
作用:
JVM方法栈为JVM线程私有内存,当方法运行完毕后,其对应的栈帧内存会自动释放
相关参数:
-Xss --设置方法栈的最大值
TLAB:
JVM所占用的主要内存都是从堆空间分配的,堆是所有线程共享的,因此在堆上分配内存需要加锁,Sun JDK为提升效率,会为每个新建的线程在Eden上分配一块独立的空间由该线程独享,这块空间称为TLAB(Thread Local Allocation Buffer)。其大小由JVM根据运行情况计算得到,也可通过参数-XX:TLABWasteTargetPercent来设置TLAB可占用的Eden空间的百分比,默认值为1%。在TLAB上分配内存不需要加锁,因此JVM在给线程中的对象分配内存时会尽量在TLAB上分配。如果对象过大或TLAB用完,则仍然在堆上进行分配。
2.Sun JDK GC收集器
跟踪收集器简介
复制(Copying)
ü 优缺点:在空间中存活对象较多的情况下较为高效,但由于该算法为直接回收不存活对象所占用的内存,因此会造成内存碎片。
标记-压缩(Mark-Compact)
ü 算法:标记阶段与“标记-清除”算法相同,但在清除阶段有所不同。在回收不存活对象所占用的内存空间后,会将其他所有存活对象都往左端空闲的空间进行移动,并更新引用其对象指针。
ü 过程:
ü 优缺点:在“标记-清除”的基础上还需要进行对象移动,成本相对较高,好处则是不产生内存碎片。
3. Sun JDK GC策略
图4 Sun JDK中可用的GC方式
基于上一小节讲解的跟踪收集器算法,Sun JDK在新生代和老生代进行了不同的算法实现,形成了上图中的GC方式分布。本小节将具体介绍新生代和老生带的GC策略及组合方式。
新生代 – 串行GC(Serial Copying)
算法:复制(Copy)
过程:
1. 扫描出新生代中存活的对象;
2. Minor GC将存活的对象复制到做为To Space的S0/S1区;
3. 之前做为To Space/From Spache的S0/S1区对换角色;
4. 经历过几次Minor GC仍然存活的对象,放入老生代。
新生代 – 并行回收GC(Parallel Scavenge)
算法:复制(Copy)
过程:在扫描和复制时均采用多线程方式进行(如下图),并且并行回收GC为大的新生代回收做了很多优化(可以自行扩展阅读相关资料)。
新生代 – 并行GC(ParNew)
老生代 – 串行GC(Serial MSC)
老生代 – 并行GC(Parallel Mark Sweep、Parallel Compacting)
老生代 – 并发GC(CMS:Concurrent Mark-Sweep GC)
优缺点:如上图,优点是只有在第一次标记和重新标记阶段需要暂停整个应用,所以能够做到影响应用响应时间很短。缺点是并发标记和并发收集阶段CMS会与应用线程争用CPU资源(用增量CMS模式可以缓解),并且容易产生内存碎片,free-list机制会导致Minor GC效率下降。
配置方法:通过-XX:UseConcMarkSweepGC来启动老生代CMS GC;通过-XX:+UseCMSCompactAtFullCollection来启动内存碎片整理功能(整理也会暂停应用)。
4.Sun JDK GC默认策略及组合策略
ü Clinet、Server模式默认GC策略
|
新生代GC方式 |
旧生代和持久代GC方式 |
Client |
串行GC |
串行GC |
Server |
并行回收GC |
Parallel Mark Sweep GC |
ü Sun JDK GC组合方式
|
新生代GC |
旧生代和持久代GC |
-XX:+UseSerialGC |
串行GC |
串行GC |
-XX:+UseParallelGC |
并行回收GC |
Parallel Mark Sweep GC |
-XX:+UseConcMarkSweepGC |
并行GC |
并发GC 当出现Concurrent Mode Failure时采用串行GC |
-XX:+UseParNewGC |
并行GC |
串行GC |
-XX:+UseParallelOldGC |
并行回收GC |
Parallel Mark Conpact |
-XX:+UseConcMarkSweepGC -XX:-UseParNewGC |
串行GC |
并发GC 当出现Concurrent Mode Failure或Promotion Failed时采用串行GC |
不支持的组合方式 |
1.-XX:+UseParNewGC -XX:+UseParallelOldGC 2.-XX:+UseParNewGC -XX:+UseSerialGC |
相关推荐
JVM虚拟机垃圾回收机制图谱说明
Jvm垃圾回收机制 by linux_14胡嘉辉1.如何确定某个对象是“垃圾”? 2.典型的垃圾收集算法3.典型的垃圾收集器
文章目录Java虚拟机(JVM)JVM的基本结构类加载机制类的生命周期类加载器的种类类加载机制运行时数据区(内存分析)垃圾回收机制新生代(Young Generation)老年代(Old Generation)元空间(Meta Space) Java虚拟机...
详细介绍了jvm生命周期和体系结构及垃圾回收机制
圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制。该思维导图完整的描述了垃圾回收的各个关键点
java工程师高级面试之JVM虚拟机底层原理篇:VM种类,内存结构,运行原理,垃圾回收算法,各种垃圾回收器等。
资源概要:JVM基础知识;类加载子系统;运行时数据区;对象的创建流程与内存分配;...从广义上讲Java,Kotlin、Clojure、JRuby、Groovy等运行于Java虚拟机上的编程语言及其相关的程序都属于Java技术体系中的一员。
第2章 Java内存区域与内存溢出异常 / 24 2.1 概述 / 24 2.2 运行时数据区域 / 25 2.2.1 程序计数器 / 25 2.2.2 Java虚拟机栈 / 26 2.2.3 本地方法栈 / 27 2.2.4 Java堆 / 27 2.2.5 方法区 / 28 2.2.6 运行...
它采用了“一次编写,到处运行”的原则,即一次编写的程序可以在不同的操作系统上运行,这得益于Java虚拟机(JVM)的存在。JVM是Java的核心组成部分,它可以将Java代码解释成特定平台上的机器码,从而实现跨平台运行...
JVM虚拟机,经典java虚拟机,了解java的运行机制及详细内存分配和垃圾回收
自己看书整理的 java虚拟机精品知识点 java内存区域与内存溢出处理 虚拟机栈和本地方法栈区别 对象定位访问 垃圾收集器GC管理 虚拟机GC垃圾回收收集算法(内存回收方法论) 虚拟机GC垃圾回收收集器(内存回收具体实现...
关于java虚拟机的详细解析,从内存分析到垃圾回收算法,hotspot虚拟机回收机制的详细分析,欢迎下载!
一, 垃圾回收机制 在系统运行过程中会产生一些无用的对象,这些对象一直占用内存,不清理这些无用的对象可能会导致内存耗尽,所有垃圾回收机制的是内存. 垃圾收集的原理和概念 对于对象实例收集.主要有两种基本算法,...
2.1、JVM相关概念 1、什么是JVM 2、JVM能运行哪些编程语言 3、JVM运行流程 4、JVM生命周期 5、三大流行的JVM 2.2、JVM体系结构 1、类加载器 2、执行引擎 3、运行时数据区 4、本地库接口 2.3、JVM内存参数调整及监控 ...
第20节Java虚拟机-高性能Java虚拟机00:02:58分钟 | 第21节Java虚拟机-TaobaoVM00:03:06分钟 | 第22节Java内存区域-简介00:07:56分钟 | 第23节Java内存区域-Java虚拟机栈00:12:04分钟 | 第24节Java内存区域-程序...
Java虚拟机(JVM)是Java Virtual Machine的缩写,它是一种规范用于计算设备。引入Java虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就...
JVM虚拟机分享,包括虚拟机发展、内存模型及垃圾回收机制介绍
JVM(Java虚拟机)是Java平台的核心组件之一,它是一个在计算机上运行Java字节码的虚拟机。JVM 提供了Java程序运行的环境和基础设施,并且具有高度的可移植性和跨平台性。 JVM 的主要功能包括字节码解释和执行、...
主要介绍了简单介绍Java垃圾回收机制,涉及一些相关的Java术语,Hotspot虚拟机,jvm体系结构等内容,具有一定借鉴价值,需要的朋友可以参考下。