自动内存管理

运行时区域

Java 8 之前:
分为
image.png
Java 8的堆
image.png

类加载机制

类加载器

  • 启动类加载器
  • 扩展类加载器
  • 应用类加载器(也有叫系统类加载器的)
  • 自定义类加载器

image.png

双亲委派机制

主要是为了保证一个 Java 类在 JVM 中是唯一的

双委委派机制的破坏

1. 兼容性问题

2. SPI机制

线程上下文类加载器(Thread Context ClassLoader)

3. 热部署

4.Tomcat对双亲委派机制的破坏

Tomcat的Catalina容器中,存放这多个应用,每个应用都有各自的第三方依赖,这些依赖,可能有公共的部分,也有可能有不同的版本,而双亲委派机制通过全限定类名确定唯一的类,无法识别版本。

  • Tomcat为什么要破坏双亲委派机制?

因为双亲委派机制无法满足Tomcat容器内多个应用程序的依赖包共存的问题

  • Tomcat如何破坏双亲委派机制?

image.png

  • 常规的双亲委派机制是先一层一层向自己的父加载器询问是否加载某个类,当父加载器没有加载时,才由当前类加载器加载
  • Tomcat的加载顺序
    1. 在 Web 应用本地目录(缓存)下查找要加载的类
    2. 系统类加载器
    3. ExtClassLoader扩展类加载器,(这一步很关键,防止应用程序的类覆盖JRE的类)
    4. 如果 ExtClassLoader 加载器加载失败,也就是说 JRE 核心类中没有这类,那么就在本地 Web 应用目录下查找并加载
    5. 如果本地目录下没有这个类,说明不是 Web 应用自己定义的类,那么由系统类加载器去加载。这里请你注意,Web 应用是通过Class.forName调用交给系统类加载器的,因为Class.forName的默认加载器就是系统类加载器。
    6. 如果上述加载过程全部失败,抛出 ClassNotFound 异常

深入理解 Tomcat(四)Tomcat 类加载器之为何违背双亲委派模型

Jvm优化

逃逸分析

  1. -XX:+DoEscapeAnalysis 手动开启逃逸分析
  2. -XX:+PrintEscapeAnalysis 查看分析结果
  3. 有了逃逸分析支持之后,可以使用参数
  4. -XX:+EliminateAllocations 开启标量替换
  5. +XX:+EliminateLocks 开启同步消除
  6. -XX:+PrintEliminateAllocations 查看标量的替换情况

基于逃逸分析,java可以实现以下优化技术:

栈上分配

标量替换

同步消除(锁消除)

image.png
image.png

class字节码,在方法区的存储

image.png

image.png