学习:JVM扫盲

HotSpot: 一种虚拟机,是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。

TLAB: Thread Local Allocation Buffer,每个线程在Java堆中预先分配一的小块内存,即线程本地分配缓存区。是仅供当前线程存放对象的内存块,其他线程不能在此区域存放对象。可解决多线程中,新建对象时的线程安全问题。通过 -XX:+/-UseTLAB 设置。分配时线程独占,读取、使用、回收时线程共享。被 HotSpot 采用。

运行时内存区

java虚拟机运行时的内存区域划分

线程共享区:

方法区: 用于保存类的信息,静态属性,常量池等内容。

Java堆: 新建对象时开辟空间,保存对象的区域。

线程私有区:

程序计数器区: 可以看作是当前运行的字节码文件的行号指示器。

虚拟机栈: 保存 栈帧 的容器,数据结构是栈,一种一端开口的容器,先进后出。
本地方法栈: 与虚拟机栈类似,是本地方法的容器。

JVM 垃圾回收

引用计数算法: 一个未被采用的算法,当对象被引用时其引用计数器 +1 ,当对象的某个引用结束,则计数器 -1 ,执行垃圾回收时释放计数器为 0 的对象。此算法很难处理循环引用的情况。

循环引用: 即,有两个类Class A 和 Class B, A 中的 属性 b 是 B 类型且 B 中的属性 a 是 A 类型。 新建两个对象A、B的实例,让他们的属性互相引用。此时 A、B 的状态就是循环引用。如果当引用 A、B 两个实例的变量为 NULL ,此时当前线程无法获得A、B的引用了,但引用计数算法并没有把他们两个当作垃圾对象,因为他们各自的属性引用了对方,所以引用计数器都为1。导致垃圾回收时无法回收此类对象。

标记-清除算法: 将需要清除的内存标记,然后执行垃圾回收释放标记的内存。会产生碎片化的内存空间 ,不利于内存的合理利用。

标记-整理算法: 将需要清楚的内存标记,释放垃圾占用的内存后,将非垃圾内存整理成连续的空间。防止内存的碎片化,但效率比较低。

复制算法: 将可用内存划分为两块,使用时只在其中一块内存中存放对象,然后清除垃圾对象后,将剩余非垃圾对象连续的复制到另一块内存中清空原来的内存空间,每次只使用一半的可用内存空间。放置了内存的碎片化,内存利用率比较低。

GCRoot: 垃圾回收根对象,从此类对象开始进行可达性分析,所有 “ 不可达 ” 的对象都是垃圾对象。即,未被根对象直接或间接引用到的对象为垃圾对象。可达性分析中静态变量、常量、虚拟机栈中的变量、本地方法栈中的变量,所有他们引用的对象都可以作为根对象。

GC : Garbage Collection 垃圾收集,垃圾回收机制。

Minor GC: 年轻代的垃圾回收是 Minor GC。

Major GC: 老年代的垃圾回收。

Full GC: System.gc() 会建议JVM执行Full GC

STW: stop-the-world ,当年轻代或老年代在进行垃圾回收的时候,会将当前jvm中的全部线程挂起,也就是说不允许其他线程创建对象,一个同步机制。

垃圾收集器:
1. Serial: 串行,单线程的垃圾回收器,当垃圾收集时会发生STW,用于新生代。
2. Serial Old: 串行,单线程的垃圾回收器,导致STW,用于老年代。
3. Parallel Scavenge: (并行清除) Java1.8 默认采用的,并行处理的垃圾回收器,导致STW,用于新生代。
4. Parallel Old: Java1.8 并行的垃圾回收器,导致STW,用于老年代。
5. ParNew: 新的并行垃圾收集器,用于搭配CMS,导致STW,用于新生代。
6. CMS: ConcurrentMarkSwap ,为了解决STW时间过长的问题,毫秒级STW,可与用户线程并发执行的垃圾回收器,采用 “ 标记-清理 ” 算法执行垃圾回收。

初始标记:只找 GC Root 的直接引用,会短暂STW(可忽略时间)
并发标记:继续找 GC Root 的间接引用,与用户线程并行执行,可能会产生浮动垃圾。可能会导致错标情况,当并发标记结束的同时,用户线程的变量重新引用了某个被标记的内存地址,导致错标。
重新标记:处理错标,引发短暂STW。
并发清理:与用户线程并发执行垃圾回收,采用标记-清理算法。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值