从 Java 基础到掌握 — 第 9 集
了解 JVM 内存、GC 和 JIT 的作用
该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。
Java 代码运行在 JVM 之上,并在运行时的帮助下处理类加载、内存管理和执行优化。 重要的是要了解此过程如何影响性能和错误,而不是记住内部术语。
类加载和字节码
Source.java
↓ compiler
Source.class
↓ class loader
JVM execution
类加载器找到所需的类并验证它是否是 JVM 可以使用的形式。 如果类路径或依赖项不匹配,即使编译成功,在执行过程中也可能找不到该类。
栈和堆
方法调用信息和局部变量在每个线程的调用帧中管理。 可以从多个地方引用的对象是在托管堆区域中创建的。
void update() {
int damage = 10;
Monster monster = new Monster();
monster.takeDamage(damage);
}
Damage 是一个原始类型值, Monster 变量是一个对象引用。 实际的放置和优化是由JVM实现决定的,所以所有的对象位置不应该用简单的公式来判断。
Garbage Collector
无法再访问的对象将受到 GC 收集。 有GC并不意味着永远不会出现内存泄漏。
如果静态集合或事件侦听器继续引用未使用的对象,则它仍然可访问。 文件、套接字等外部资源应直接关闭,无需等待 GC。
即时优化
JVM 可以通过观察执行过程中频繁使用的代码并将其编译成机器语言来优化代码。 仅从很短的执行时间来判断整体性能可能会混淆准备和优化。
对于性能问题,在更改堆大小或 GC 选项之前,应使用分析器测量配额、CPU 使用率和锁定等待。 JVM知识是解释测量结果原因的基础,而不是推测性的微观优化。