Java 核心机制深度剖析
·
内存管理机制
Java 内存模型(JMM)基于堆、栈、方法区等结构。堆内存存放对象实例,由垃圾回收器(GC)自动管理,采用分代收集算法(新生代使用复制算法,老年代使用标记-整理或标记-清除)。栈内存存储局部变量和方法调用帧,线程私有。方法区(元空间)存储类信息、常量等。
垃圾回收机制
- 可达性分析:通过 GC Roots(如静态变量、活动线程等)判断对象是否存活。
- 垃圾回收器:
- G1:面向大堆内存,采用分区标记-整理算法,可控停顿时间。
- ZGC:低延迟,支持 TB 级堆内存,通过染色指针和读屏障实现并发标记。
- 调优参数:
-Xmx(最大堆内存)、-XX:+UseG1GC(启用 G1)等。
多线程与并发
- 线程模型:基于
Thread类和Runnable接口,线程状态包括 NEW、RUNNABLE、BLOCKED 等。 - 锁机制:
- synchronized:JVM 内置锁,支持偏向锁、轻量级锁、重量级锁升级。
- AQS:
ReentrantLock底层通过 CAS 和队列实现可重入锁。
- 并发工具:
ConcurrentHashMap分段锁、CountDownLatch同步屏障。
JVM 执行引擎
- 字节码解释执行:逐条解释字节码,效率较低。
- JIT 编译:热点代码编译为本地机器码(如 C1/C2 编译器),触发条件通过
-XX:CompileThreshold设置。 - 类加载机制:双亲委派模型(Bootstrap → Extension → Application 类加载器),避免重复加载。
异常处理机制
- 检查异常:需显式捕获(如
IOException)。 - 非检查异常:运行时异常(如
NullPointerException),通常由编程错误导致。 - 异常表:字节码中通过
try-catch-finally块生成异常处理逻辑。
反射与动态代理
- 反射 API:
Class.forName()获取类对象,Method.invoke()调用方法。 - 动态代理:基于
Proxy和InvocationHandler实现运行时接口代理,常用于 AOP。
性能优化建议
- 避免频繁创建对象,优先复用对象(如对象池)。
- 合理设置堆内存大小,避免频繁 Full GC。
- 使用
StringBuilder替代字符串拼接减少内存开销。
代码示例(锁使用):
// 使用 ReentrantLock 替代 synchronized
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
// 临界区代码
} finally {
lock.unlock();
}
公式示例(GC 停顿时间估算):停顿时间 ≈ 存活对象数量 / 回收器吞吐量
更多推荐



所有评论(0)