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编译器能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上。
    逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸。

    栈上分配

    标量替换

    锁优化