本文主要介绍一些jvm相关的知识点,其中主要包括堆空间的分代思想,Major GC Minor GC Full GC 的介绍以及三种GC的触发机制,另外还有对TLAB的了解和一些测试时用的参数配置说明例如(–Xmx10m --Xms10m --Xmn2g)
文章目录
-
摘要
-
前言
-
一、分代思想
-
- 1.为什么需要把java堆进行分代,不分代就不能正常工作了吗?
-
二、三类GC介绍
-
- 1.Minor GC
-
2.Major GC
-
3.Full GC
-
三、内存分配策略
-
四、TLAB(Thread Local Allocation Buffer)
-
- 1.什么是TLAB
-
2.为什么有TLAB(Thread Local Allocation Buffer)
-
五、测试堆空间常用的jvm参数
=====================================================================
在jvm中,大致可以将堆空间分为年轻代,老年代,永久代,在这些区分中免不了的要进行垃圾回收(GC),接下来简述为什么要进行划分以及三种主要的GC的介绍,至于jvm更基本的知识可以参见其他文章
=========================================================================
1.为什么需要把java堆进行分代,不分代就不能正常工作了吗?
经研究,不同对象的生命周期不同,70%~90%是临时对象
1.新生代:有Eden,两块大小相同的Survivor(又称form/to,s0/s1)
构成,form和to总有一方为空,并且form和to不固定指向哪方
2.老年代:存放新生代中经历多次GC仍能存活的对象
理解: 其实不分代完全可以,分代的唯一理由就是优化GC性能,如果没有分代,那所有的对象在一块,就如同把学校的人都关在一个教室,GC的时候要找到哪些对象没用,这样就会对堆的所有区域进行扫描,而很多对象都是朝生夕死的,如果分代的话,把新创建的对象放到某一地方,当GC的时候先把这块存储“朝生夕死”对象的区域进行回收,这样就会腾出很大的空间出来
Jdk8以后开始把类的元数据放在本地堆内存中,这一块区域就叫做Metaspace
该区域在jdk7及以前是属于永久带的,元空间和永久代都是用来存储class相关信
息,包括class对象的Method,Field等,元空间和永久代其实都是方法区的实现,
只是实现有所不同,所以说方法区其实只是一种JVM的规范。
其中:Jdk1.6 —> jdk1.7的时候将字符串常量池存放的地方从方法区改到
了堆空间
===========================================================================
JVM在进行GC时,并非每次都对上面三个内存(新生代,老年代,方法区)区域
一起回收的,大部分时候回收的都是指新生代。
针对HotSpot VM的实现,它里面的GC按照回收区域分为两大种类型:一种是部
分收集(Partial GC),一种是整堆收集(Full GC)
1.部分收集:不是完整收集整个Java堆的垃圾收集,其中又分为:
(1)新生代收集(Minor GC / Young GC):只是新生代(Eden / S0,S1)的
垃圾收集
(2)老年代收集(Major GC / Old GC):只是老年代的垃圾收集
· 目前,只有CMS GC 会有单独回收老年代的行为
· 注意,很多时候Major GC 会和Full GC 混淆使用,需要具体分辨是
老年代回收还是整堆回收
(3)混合收集(Mixed GC):收集整个新生代以及部分老年代的垃圾收集
· 目前,只有G1 GC会有这种行为
2.整堆收集(Full GC):收集整个Java堆和方法区的垃圾收集
年轻代GC(Minor GC)触发机制
1.当年轻代空间不足时,就会触发Minor GC,这里的年轻代满指的是Eden代满,Survivor满不会引发GC(每次Minor GC 会清理年轻代的内存)
2.因为,Java对象大都具备朝生夕死的特性,所以MinorGC非常频繁,一般回收速度也比较快,这一定义既清晰又易于理解
3.Minor GC会引发STW,暂停其他用户的线程,等垃圾回收结束,用户线程才恢复运行**
Java中Stop-The-World机制简称STW,是在执行垃圾收集算法时,Java应用程
序的其他所有线程都被挂起(除了垃圾收集帮助器之外)。Java中一种全局暂停现
象,全局停顿,所有Java代码停止,native代码可以执行,但不能与JVM交互;这
些现象多半是由于gc引起,因此jvm调优大部分是让GC的次数少一些。
老年代GC(Major GC)触发机制
1.指发生在老年代的GC,对象从老年代消失时,我们说“MajorGC”或“Full GC”发生了
2.出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略里就有直接进行MajorGC的策略选择过程)
·也就是在老年代空间不足时,会先尝试触发MinorGC,如果之后空间还不足,则触发Major GC
3.Major GC的速度一般会比Minor GC慢十倍以上,STW的时间更长
4.如果Major GC后,内存还不足,就报OOM了
5.Major GC的速度一般会比Minor GC慢十倍以上
最后
你要问前端开发难不难,我就得说计算机领域里常说的一句话,这句话就是『难的不会,会的不难』,对于不熟悉某领域技术的人来说,因为不了解所以产生神秘感,神秘感就会让人感觉很难,也就是『难的不会』;当学会这项技术之后,知道什么什么技术能做到什么做不到,只是做起来花多少时间的问题而已,没啥难的,所以就是『会的不难』。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
我特地针对初学者整理一套前端学习资料
**』,对于不熟悉某领域技术的人来说,因为不了解所以产生神秘感,神秘感就会让人感觉很难,也就是『难的不会』;当学会这项技术之后,知道什么什么技术能做到什么做不到,只是做起来花多少时间的问题而已,没啥难的,所以就是『会的不难』。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
我特地针对初学者整理一套前端学习资料
[外链图片转存中…(img-XrpPKaRh-1714311459323)]