JVM学习笔记

字节码文件组成部分:
魔数-标识文件类型的文件头,固定为0xCAFEBABE
主、副版本号-(1.2版本后,大版本号计算格式:主版本号-44)
常量池、符号引用【面试题:int i=0,i=i++,i还是为0】
方法

字节码指令:
iconst
istore
iload
iadd
return
iinc…by…

自增
右自增i++:先自增,后赋值
左自增++i:先赋值,后自增

字节码工具
jclasslib
javap:在服务器上查看字节码文件
jclasslib的idea插件(推荐)
阿里arthas(推荐):用于服务器端,https://arthas.aliyun.com/doc/

jclasslib小技巧:鼠标左键点击语句可跳转到相应的jvm规范文档

类的生命周期
加载、连接、初始化、使用、卸载
连接又可以分为:验证、准备、解析

HSDB是什么?怎么用?

clinit指令

类加载器ClassLoader
分类Bootstrap、Application、Extention
双亲委派机制

如何通过Bootstrap类加载器去加载用户jar包?
如何通过Application类加载器去加载用户jar包?
如何通过Extention类加载器去加载用户jar包?

Arthas中的类加载器的相关功能有哪些?

双亲委派机制的作用?

在Java中如何使用代码的方式去主动加载一个类?
Class.forName()方法
getLoader

如何打破双亲委派机制?什么时候需要打破?
自定义类加载器
线程上下文类加载器
Osgi框架的类加载器(了解)

SPI机制是什么?

JDK9之后的类加载器
BuiltinClassLoader

运行时数据区
线程不共享
程序计数器
栈:栈内存、java虚拟机栈、栈帧(局部变量表、操作数栈、帧数据)、本地方法栈
堆:堆内存
线程共享
方法区:类的元信息、运行时常量池、字符串常量池
直接内存
好懵逼啊,看看javaguide理解

栈内存溢出StackOverflowError
-Xss256k设置栈内存大小,节省内存

堆内存溢出OutofMemoryError
-Xmx设置堆内存最大值
-Xms设置堆内存最小值
建议设置成相同值

方法区溢出
JDK7VSJDK8

手动设置直接内存的大小

垃圾回收GC(自动、手动)
方法区回收
堆回收

System.gc()

判断堆上的对象是否被引用
引用计数法
可达性分析法

5种对象引用

软引用
new SoftReference<对象类型>(对象)
Caffeine框架
队列机制

弱引用
虚引用
终结器引用

垃圾回收算法
核心思想是什么?
找到内存中存活的对象,释放不再存活对象的内存,使得程序能再次利用这部分空间
垃圾回收算法的分类?4种
STW过程是什么?垃圾回收的过程中,会出现所有用户线程终止的过程
如何判断GC算法是否优秀?3个维度(吞吐量高、最大暂停时间短、堆使用效率高)
如何选择GC算法来优化?根据实际场景选择,不同GC算法各有优点
标记清除算法的核心思想是什么?将所有存活的对象进行标记(可达性分析算法),从内存中删除没有被标记的对象
复制算法的核心思想是什么?
准备两块空间(From和To),
在分配对象时用From空间,GC ROOT在此时建立与存活对象有关的引用链(小团体成立了,垃圾对象被孤立…)
在垃圾回收时将存活对象复制到To空间,
回收完成时,From和To空间呼唤身份(什么CallMeByYourName哈哈哈哈)
标记整理算法(标记压缩算法)的核心思想是什么?
在标记清除算法的核心思想的基础上,增加了整理阶段,
将存活对象移动到堆的另一端,清理掉存活对象的内存空间,解决了内存碎片化的问题
分代垃圾回收算法核心思想是什么?(重中之重)年轻代、伊甸区、老年代

垃圾回收器

MAT内存泄漏检测原理
支配树
深堆
浅堆

k8s
Oss

内存溢出产生的原因
持续内存泄漏
高并发请求

解决内存泄漏通用步骤
监测、诊断、修复、验证

GC调优
对垃圾回收进行调优,避免由垃圾回收引起程序性能下降

jstat工具
visualvm插件
prometheus+grafana

在控制台中输出GC日志
-verbose:gc

GC日志
JDK8- -XX:+PrintGCDetails -Xloggc:输出目录
JDK9+ -Xlog:gc*:file=输出目录

怎么在IDEA中添加虚拟机参数?

GC日志查看工具
GC Viewer
GCeasy

常见的GC模式可视化图表

FullGC是什么?

设置元空间大小
-XX:MaxMetaspaceSize
-XX:MetaspaceSize