JVM
JVM内存结构
运行时数据区域
运行时数据区哪些是线程独享
在JVM运行时内存区域中,PC寄存器、虚拟机栈和本地方法栈是线程独享的。
而Java堆、方法区是线程共享的。但是值得注意的是,Java堆其实还未每一个线程单独分配了一块TLAB空间,这部分空间在分配时是线程独享的,在使用时是线程共享的。
堆和栈的区别
方法区在不同版本JDK中的位置
堆外内存
TLAB
Java中的对象一定在堆上分配吗?
JVM内存分配策略:
1、根据Java虚拟机规范,Java虚拟机所管理的内存包括方法区、虚拟机栈、本地方法栈、堆、程序计数器等。
2、我们通常认为JVM中运行时数据存储包括堆和栈。这里所提到的栈其实指的是虚拟机栈,或者说是虚拟栈中的局部变量表。
3、栈中存放一些基本类型的变量数据(int/short/long/byte/float/double/Boolean/char)和对象引用。
4、堆中主要存放对象,即通过new关键字创建的对象。
5、数组引用变量是存放在栈内存中,数组元素是存放在堆内存中。
垃圾回收
GC算法
标记清除
引用计数
复制
标记压缩
分代回收
增量式回收
GC参数
对象存活的判定
垃圾收集器
CMS
G1
ZGC
Epsilon
JVM参数及调优
-Xmx
-Xmn
-Xms
-Xss
-XX:SurvivorRatio
-XX:PermSize
-XX:MaxPerSize
-XX:MaxTenuringThreshold
Java对象模型
oop-klass
对象头
HotSpot
及时编译器
编译优化
Java内存模型
计算机内存模型
缓存一致性
MESI协议
可见性
原子性
顺序性
happens-before
as-if-serial
内存屏障
synchronized
volatile
final
锁
虚拟机性能监控与故障处理工具
jps
jstack
jmap
jhat
javap
TProfiler
Arthas
类加载机制
classLoader
类加载过程是线程安全的吗?
类加载过程
双亲委派
Java语言系统中支持以下4种类加载器:
- Bootstrap ClassLoader 启动类加载器:主要负责加载Java核心类库,%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。
- Extention ClassLoader 标准扩展类加载器:主要负责加载目录%JRE_HOME%\lib\ext目录下的jar包和class文件。
- Application ClassLoader 应用类加载器:主要负责加载当前应用的classpath下的所有类
- User ClassLoader 用户自定义类加载器:用户自定义的类加载器,可加载指定路径的class文件
如何破坏双亲委派
模块化
jboss modules
osgi
jigsaw
打包工具
jar
jlink
jpackage
编译与反编译
什么是编译
什么是反编译
编译工具
javac
反编译工具
jad
CRF
JIT
1、动态编译(dynamic compilation)指的是“在运行时进行编译”;与之相对的是事前编译(ahead-of-time compilation,简称AOT),也叫静态编译(static compilation)。
2、JIT编译(just-in-time compilation)狭义来说是当某段代码即将第一次被执行时进行编译,因而叫“即时编译”。JIT编译是动态编译的一种特例。JIT编译一词后来被泛化,时常与动态编译等价;但要注意广义与狭义的JIT编译所指的区别。
3、自适应动态编译(adaptive dynamic compilation)也是一种动态编译,但它通常执行的时机比JIT编译迟,先让程序“以某种式”先运行起来,收集一些信息之后再做动态编译。这样的编译可以更加优化。JIT优化
逃逸分析
逃逸分析(Escape Analysis)是目前Java虚拟机中比较前沿的优化技术。这是一种可以有效减少Java 程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。通过逃逸分析,Java Hotspot编译器能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上。
逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸。栈上分配
标量替换
锁优化