class文件结构 前面讨论JVM内存模型和JVM运行原理时,我们多次提及到了class文件,当时为了行为内容的简洁,并没有展开描述,今天我们就来认识一下这个文件。 我们知道,JVM在执行某个类的时候,必须经过加载、连接、初始化,而连接又包括验证、准备、解析三个阶段。 在加载类的时候,JVM会先加载class文件,而在class文件有类的版本、字段、方法和常量池(Constant Pool Table)等信息。通过j 2020-09-26 Java #JVM
JVM内存分配 我们知道,在大多数情况下,我们基本不用去调整JVM内存分配,因为一些初始化的参数已经可以保证应用服务正常稳定地工作了。但这并不意味着我们不需要理解JVM内存分配,尤其是在遇到一些性能问题时。 那么,当出现JVM内存性能问题时,我们该如何调优呢?在回答这个问题之前,我们先来了解一下JVM的内存分配。 一、JVM的内存性能问题 谈到JVM表现出的内存性能问题时,我们可能会想到一些线上的JVM内存溢出事 2020-09-26 Java #JVM
JVM垃圾回收机制 JVM具备自动内存管理机制,这个机制虽然可以减轻很多工作量,但是完全交由JVM处理,也会增加回收性能的不确定性。尤其是在一些特殊的业务场景下,不合适的垃圾回收算法以及策略,都有可能导致系统性能下降。因此,我们有必要了解一下JVM的垃圾回收机制。 一、GC机制 在认识GC算法之前,我们需要先弄清楚3个问题。第一,回收发生在哪里?第二,对象在什么时候可以被回收?第三,如何回收这些对象? 1.1、回收发 2020-09-26 Java #JVM
JVM即时编译 在讨论java类编译加载执行过程时,我们提到了编译这个概念。一说到编译,我们一定会想到将.java文件编译成.class文件的过程,这个编译我们一般称为前端编译。Java的编译和运行过程非常复杂,除了前端编译外,还有运行时编译。 一、什么是即时编译 即时编译,也被称为运行时编译。由于操作系统无法直接运行java生成的字节码,因此,在运行时,JIT或解释器会将字节码转换成机器码,这个转换过程就叫运行 2020-09-20 Java #JVM
Java代码是如何在JVM中运行的 在前面我们讨论了JVM内存模型和Java类的编译加载执行过程。接下来我,我们通过一个案例进一步加深对JVM的认识。源代码如下: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061public class JVMcase 2020-09-20 Java #JVM
Java类编译加载执行过程 JVM在执行某个类的时候,需要经过编译、加载、链接、初始化和运行时编译等过程。整个过程如下图所示: 接下来,我们详细了解一下Java类从编译到运行的整个过程。 一、类编译 在我们编写好java源代码后,需要将.java源代码文件编译成.class字节码文件,这样代码才能在JVM虚拟机上正常运行。.java文件的编译通常是由JDK中自带的javac工具完成的,对于一个简单的.java文件,我们可以 2020-09-20 Java #JVM
JVM内存模型 JVM不仅承担了Java字节码的分析(JIT compiler)和执行(Runtime),而且还内置了自动内存管理机制,负责内存的分配与回收。 JVM自动内存管理机制虽然有诸多好处,但其实是把双刃剑,它在提升Java开发效率的同时,也容易使开发人员过度依赖于这个机制,从而弱化对内存的管理能力。这样系统就很容易发生JVM堆内存异常、垃圾回收(GC)方式不合适以及GC次数过于频繁等问题,这些都将直接影 2020-09-20 Java #JVM