类的生命周期包含7个关键阶段,分为三个主要时期
核心任务:获取类的二进制字节流
技术实现:
// HotSpot源码示例(类加载入口)
instanceKlassHandle ClassLoader::load_classfile(Symbol* name) {
PerfClassTraceTime timer(ClassLoader::perf_accumulated_time());
return load_classfile_internal(name);
}
四层验证机制:
内存分配规则:
数据类型 | 初始值 | 特殊处理 |
---|---|---|
基本类型 | 零值 | 直接分配 |
引用类型 | null | 分配指针空间 |
常量(final) | 真实值 | 直接赋值 |
符号引用转换类型:
CONSTANT_Class_info // 类/接口
CONSTANT_Fieldref_info // 字段
CONSTANT_Methodref_info // 方法
CONSTANT_InterfaceMethodref // 接口方法
执行特征:
典型初始化陷阱:
public class InitializationDemo {
static {
System.out.println(threadSafeVar); // 编译错误
threadSafeVar = 1; // 允许赋值
}
private static int threadSafeVar = 0;
}
调用类型 | 执行方式 | 示例 |
---|---|---|
invokestatic | 静态绑定 | Math.abs() |
invokevirtual | 动态绑定 | obj.toString() |
invokeinterface | 接口动态绑定 | list.iterator() |
invokespecial | 直接调用 | 构造函数/私有方法 |
Object obj = new MyClass(); // 强引用
WeakReference<MyClass> ref = new WeakReference<>(new MyClass()); // 弱引用
JVM参数:
-XX:+TraceClassLoading # 跟踪类加载
-XX:+TraceClassUnloading # 跟踪类卸载
代码验证示例:
public class ClassUnloadTest {
public static void main(String[] args) throws Exception {
CustomClassLoader loader = new CustomClassLoader();
Class<?> clazz = loader.loadClass("SampleClass");
clazz = null;
loader = null;
System.gc(); // 触发Full GC
}
}
interface MyInterface {
int VALUE = new Random().nextInt(100); // 初始化时赋值
}
class Impl implements MyInterface {} // 不会触发接口初始化
String[] strArr = new String[10];
// 生成的数组类由JVM直接创建
// 类名为:[Ljava.lang.String;
NoClassDefFoundError:
ClassNotFoundException:
对比维度 | 永久代(≤JDK7) | 元空间(≥JDK8) |
---|---|---|
存储位置 | JVM堆内存 | 本地内存 |
垃圾回收 | Full GC触发 | 独立回收机制 |
内存限制 | -XX:MaxPermSize | -XX:MaxMetaspaceSize |
module com.myapp {
requires java.sql;
exports com.myapp.api;
}
类的生命周期管理体现了JVM的核心设计思想:
开发建议:
-verbose:class
监控类加载行为进阶方向:
理解类生命周期对以下场景至关重要:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。