JVM基础知识总结

Java虚拟机的基本结构

1. 堆空间 
2. 直接内存
3. JAVA栈
4. 本地方法栈
5. PC寄存器
6. 垃圾回收系统
7. 执行引擎

在这里插入图片描述

JVM 堆空间布局

在这里插入图片描述

JVM 的分代

年轻代 老年代 永久代

分代的原因:

1. 不同类型对象的生命周期是不一样的
2. 不同年代的对象才去不同的收集方式,以便提高回收效率
3. 如果不分代,每次垃圾回收都需要遍历内存空间,花费时间较长,效率低
4. 如果不分代,多次垃圾回收后,生命周期长的对象仍然存在,效率低

年轻代

1. 新生成的对象首先都是分配在年轻代中的
2. 年轻代的目标是尽可能快速的收集掉生命周期短的对象

TIPS:

1. Eden区用来存放JVM刚分配的对象
2. Survivor1和Survivor2 两个空间一样大,当Eden的对象经过垃圾回收没有被回收掉,会在两个Survivor之间来回Copy,当满足某个条件,比如Copy次数,会被Copy到Tenured

内存的设置

  • SurvivorRatio=eden/from=eden/to 伊甸园空间和幸存者空间的比值
  • NewRatio=tenured/young 老年代内存和年轻代内存比值

设置策略

  • 尽可能将对象预留在新生代
  • 减少老年代的GC次数

老年代

1. 在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放在老年代
2. 老年代中存放的都是一些声明周期较长的对象,例如Session对象 Socket连接等

TIPS:

- MaxTenuringThreshold是年轻代和老年代的临界值
- MaxTenuringThreshold用于控制对象能经历多少次Minor GC才晋升到旧生代
- 每发生一次Minor GC,年龄就增加1岁,当它的年龄增加到临界值(默认为15
岁),就将会被晋升到老年代中

永久代(持久代)内存

1. 永久代内存用于保存类信息。方法区的大小决定了系统可以保存多少个类
2. 过多的定义类,会导致永久代内存溢出
3. JDK1.8中 废弃永久代,取而代之的是元数据去(Metaspace)

直接内存

1. 直接内存常用于使用NIO的场景
2. 直接内存跳过了Java堆,是JAVA程序可以直接访问原生内存空间,因此,直接内存访问速度会快于堆内存
3. 直接接内存适合申请次数较少,访问较频繁的场合
4. 如果内存空间本身需要平衡申请,则不适合使用直接内存  AccessDirectBuffer

GC

GC类型GC次数回收速度耗时
Minor GC(新生代GC)频率高
Full GC/Major GC(老年代GC)频率低慢(Major GC 的速度一般要比Minor GC 慢10倍以上)

JVM基本参数

在这里插入图片描述

垃圾回收器参数

参数名称含义
-XX:+UseSerialGC串行垃圾回收器
-XX:+UseParalleGC并行垃圾回收器
-XX:+UseParalleGCThreads并发回收器的线程数
-XX:+UseParalle101dGC年老代垃圾收集方式为并行收集
-XX:+UseConcMarkSweepGC设置老年代为并发收集
-XX:+UseParNewGC设置年轻代为并行收集
-XX:+UseG1GC使用G1垃圾回收器

JVM日志参数

参数名称含义
-XX:+PrintGC输出GC日志
-XX:+PrintGCDetails输出GC的详细日志
-XX:+PrintGCTimeStamps输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps输出GC的时间戳(以日期的形式输出)
-XX:+PrintHeapAtGC在进行GC的前后打印出堆的信息

垃圾回收算法

复制算法(Copying)
1. 复制算法把内存分配为两个空间 A空间用来负责装在正常的对象信息,B空间是垃圾回收使用的
2. 每次将A中的存活的对象全部复制到空间B中,然后偶一次性将空间A中对象删除

特点

  • 内存要求大
  • 内存利用率低
  • 适用于短生存期的对象
  • 持续复制长生存期的对象会导致效率降低

在这里插入图片描述

标记清除算法(Mark-Sweep)
包括两个阶段 "标记"和"删除"
"标记"阶段 确定所有需要回收的对象,做标记
"清除"阶段 将标记阶段确定为不可用的对象清除

特点

  • 基础的收集算法
  • 标记和清除阶段的效率不高
  • 会产生大量的不连续空间
  • 会导致程序需要分配大内存空间时,可能无法找到足够的连续空间

在这里插入图片描述

标记压缩算法(Mark-Compat)
针对标记-清除算法之上进行一步压缩空间,重新移动对象
但是其不是将存活对象 作如下移动 A空间=>B空间
而是将存货对象向A空间或B空间 的一端移动,然后直接回收边界之外的内存

特点

  • 提高了内存的利用率
  • 适合收集对象存货时间较长的老年代

在这里插入图片描述

回收算法总结

内存分代新生代老年代
适用算法复制算法(Copying)标记清除算法(Mark-Sweep)/标记压缩算法(Mark-Compat)

垃圾回收器

垃圾回收算法和垃圾回收器的区别

垃圾回收算法: 内存回收算法理论
垃圾回收器: 内存回收具体实现 

垃圾回收器的分类
在这里插入图片描述

垃圾回收器的三个维度
在这里插入图片描述

Serial 收集器

  1. 单线程的收集器
  2. 对于单个CPU环境,Serial收集器由于没有线程交互的开销可以获得最高的单线程收集效率
  3. 是虚拟机运行在Client模式下的默认新生代收集器
  4. 使用"复制算法(Copying)"
  5. 缺点: 单线程GC造成中断的时间(Stop-the-world)比较大

设置参数:

"-XX:+UseSerialGC":添加该参数来显式的使用串行垃圾收集器

Serial Old收集器

  1. Serial 收集器的老年代版本
  2. 单线程收集器,使用"标记压缩(Mark-Compat)算法"
  3. 是虚拟机运行在Client模式下的默认老年代收集器

在这里插入图片描述

ParNew 收集器

  1. Serial收集器的多线程版本

设置参数:

"-XX:+UseConcMarkSweepGC":指定使用CMS后,会默认使用ParNew作为新生代收集器
"-XX:+UseParNewGC":强制指定使用ParNew
"-XX:ParallelGCThreads":指定垃圾收集的线程数量,ParNew默认开启的收集线程与CPU的数量相同

在这里插入图片描述

CMS(Concurrent Mark Sweep) 收集器

目的: 以获得最短响应时间为目标的收集器
过程: 初始标记=>并发标记=>重新标记=>并发清除

在这里插入图片描述

Parallel Scavenge Parallel Old 收集器

Parallel Scavenge 用于新生代回收
Parallel Old 用于老年代回收
复制算法 并行收集
关注点在于 可以精确的控制吞吐量

在这里插入图片描述

G1收集器

1. G1收集器是一款面向服务端应用的垃圾收集器
2. 并行与并发: G1能充分利用多CPU 多核环境下的硬件优势,使用多个CPU来缩短Stop-the-world停顿时间
3. 分代收集: G1收集器可手机新生代和老年代两种,不需要其他收集器配合就可以独立管理整个GC堆
4. 空间整合: G1采用"标记-整理"算法实现收集器,意味着G1运作期间不会产生内存空间碎片,收集后可以提供规整的可用内存
5. 可预测的停顿: 建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集器上的时间不超过N毫秒

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值