跳至主要內容
JVM性能优化整理

1、类加载过程

	Java语言是一种具有动态性的解释型语言,类(Class)只有被加载到JVM后才能运行。当运行指定程序时,JVM会将编译生成的.class文件按照需求和一定的规则加载到内存中,并组织成为一个完整的Java应用程序。

	这个加载过程是由类加载器完成,具体来说,就是由ClassLoader和它的子类来实现的。类加载器本身也是一个类,其实质是把类文件从硬盘读取到内存中。

	类的加载方式分为隐式加载和显示加载。隐式加载指的是程序在使用new等方式创建对象时,会隐式地调用类的加载器把对应的类加载到JVM中。显示加载指的是通过直接调用class.forName()方法来把所需的类加载到JVM中。

郑天祺大约 6 分钟面试JVM优化面试
JVM内存结构

1、方法区

用于存储虚拟机加载的 类信息,常量,静态变量等数据。

2、堆

存放对象实例,所有的对象和数组都要在堆上分配,是 JVM 所管理的内存最大的一块区域。

3、栈

Java 方法执行的内存模型:存储局部变量表、操作数栈、动态链接、方法出口灯信息。

生命周期与线程相同。


郑天祺小于 1 分钟面试JVM内存模型运行时数据区
JVM垃圾回收算法

1、标记 - 清除 算法

标记无用对象,然后进行清除回收。

缺点:效率不高,无法清除垃圾碎片。
image-20200918092639589
image-20200918092639589

2、复制 - 清除 算法

按照容量划分二个大小相等的内存区域,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。

缺点:内存使用率不高,只有原来的一半

郑天祺大约 1 分钟面试JVM垃圾回收面试
对象存储与指针压缩
我们知道在Java中基本数据类型的大小,例如int类型占4个字节、long类型占8个字节,那么Integer对象和Long对象会占用多少内存呢?

一、对象存储:

一个Java对象在内存中包括对象头、实例数据和补齐填充3个部分:
image-20191120195326698
image-20191120195326698

郑天祺大约 4 分钟java基础JVM内存优化对象模型
偏向锁

0、从偏向锁到重量锁

在java同步代码快中,synchronized的使用方式无非有两个 :   

1)通过对一个对象进行加锁来实现同步
synchronized(lockObject){
     //代码
 }

郑天祺大约 4 分钟java基础并发编程JVM