jvm学习笔记(GC,分代思想,TLAB)

本文详细介绍了JVM堆空间的分代思想,包括为何进行分代、新生代与老年代的区别,以及MinorGC、MajorGC和FullGC的触发机制。此外,还讨论了TLAB的概念及其在内存管理中的作用。作者以生动的比喻解释了GC的工作原理,以及如何通过调整JVM参数优化性能。
摘要由CSDN通过智能技术生成

本文主要介绍一些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的时候将字符串常量池存放的地方从方法区改到

了堆空间

二、三类GC介绍

===========================================================================

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堆和方法区的垃圾收集

1.Minor GC


年轻代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的次数少一些。

2.Major 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慢十倍以上

3.Full GC


最后

你要问前端开发难不难,我就得说计算机领域里常说的一句话,这句话就是『难的不会,会的不难』,对于不熟悉某领域技术的人来说,因为不了解所以产生神秘感,神秘感就会让人感觉很难,也就是『难的不会』;当学会这项技术之后,知道什么什么技术能做到什么做不到,只是做起来花多少时间的问题而已,没啥难的,所以就是『会的不难』。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

我特地针对初学者整理一套前端学习资料

前端路线图

**』,对于不熟悉某领域技术的人来说,因为不了解所以产生神秘感,神秘感就会让人感觉很难,也就是『难的不会』;当学会这项技术之后,知道什么什么技术能做到什么做不到,只是做起来花多少时间的问题而已,没啥难的,所以就是『会的不难』。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

我特地针对初学者整理一套前端学习资料

[外链图片转存中…(img-XrpPKaRh-1714311459323)]

vue.js的36个技巧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值