内存管理机制

Java 内存模型(JMM)基于堆、栈、方法区等结构。堆内存存放对象实例,由垃圾回收器(GC)自动管理,采用分代收集算法(新生代使用复制算法,老年代使用标记-整理或标记-清除)。栈内存存储局部变量和方法调用帧,线程私有。方法区(元空间)存储类信息、常量等。

垃圾回收机制

  • 可达性分析:通过 GC Roots(如静态变量、活动线程等)判断对象是否存活。
  • 垃圾回收器
    • G1:面向大堆内存,采用分区标记-整理算法,可控停顿时间。
    • ZGC:低延迟,支持 TB 级堆内存,通过染色指针和读屏障实现并发标记。
  • 调优参数-Xmx(最大堆内存)、-XX:+UseG1GC(启用 G1)等。

多线程与并发

  • 线程模型:基于 Thread 类和 Runnable 接口,线程状态包括 NEW、RUNNABLE、BLOCKED 等。
  • 锁机制
    • synchronized:JVM 内置锁,支持偏向锁、轻量级锁、重量级锁升级。
    • AQSReentrantLock 底层通过 CAS 和队列实现可重入锁。
  • 并发工具ConcurrentHashMap 分段锁、CountDownLatch 同步屏障。

JVM 执行引擎

  • 字节码解释执行:逐条解释字节码,效率较低。
  • JIT 编译:热点代码编译为本地机器码(如 C1/C2 编译器),触发条件通过 -XX:CompileThreshold 设置。
  • 类加载机制:双亲委派模型(Bootstrap → Extension → Application 类加载器),避免重复加载。

异常处理机制

  • 检查异常:需显式捕获(如 IOException)。
  • 非检查异常:运行时异常(如 NullPointerException),通常由编程错误导致。
  • 异常表:字节码中通过 try-catch-finally 块生成异常处理逻辑。

反射与动态代理

  • 反射 APIClass.forName() 获取类对象,Method.invoke() 调用方法。
  • 动态代理:基于 ProxyInvocationHandler 实现运行时接口代理,常用于 AOP。

性能优化建议

  • 避免频繁创建对象,优先复用对象(如对象池)。
  • 合理设置堆内存大小,避免频繁 Full GC。
  • 使用 StringBuilder 替代字符串拼接减少内存开销。

代码示例(锁使用):

// 使用 ReentrantLock 替代 synchronized  
ReentrantLock lock = new ReentrantLock();  
lock.lock();  
try {  
    // 临界区代码  
} finally {  
    lock.unlock();  
}  

公式示例(GC 停顿时间估算):
停顿时间 ≈ 存活对象数量 / 回收器吞吐量

更多推荐