返回

再看JVM,从全面角度剖析其精髓

Android

再看JVM(1)




    这次应该是我第5次看 JVM 的内容,也是第2次写 JVM 的博客,上次那篇已经作废了。以前即便学习 内存分配 和 GC 垃圾回收 那也是单独的看,从没有站在 JVM 总体设计的角度一起看思考,这次站在 JVM 总体设计的角度,我发现了更多的知识点,比如:类的加载机制,也发展其它的知识。

    从 JVM 内存角度分析: 主要内容在 JVM 中,重要的概念, JVM 内存布局, 程序计数器, Java 虚拟机栈, 本地方法栈, java 堆, 方法区。

    从 JVM 执行引擎角度分析: 主要内容包括解释器(字节码解释执行的过程), JIT 编译器(将字节码编译为本地代码的过程)。

    从 JVM 类加载器角度分析: 主要内容包括类加载器, 加载, 验证, 准备, 解析, 初始化。

    从 JVM 垃圾回收角度分析: 主要内容包括垃圾收集器(常见垃圾收集器有Serial收集器, Parallel收集器, CMS收集器, G1收集器, ZGC收集器), 垃圾收集算法(常见垃圾收集算法有标记-清除算法, 标记-整理算法, 复制算法, 分代收集算法)。

    今天 主要分析从 JVM 内存的角度, JVM 执行引擎的角度, JVM 类加载器角度分别进行分析。

    JVM 内存分配主要包括: 程序计数器, Java 虚拟机栈, 本地方法栈, Java 堆, 方法区。下面我将分别对这几个概念进行介绍。

    程序计数器: 程序计数器是一块较小的内存空间, 它可以看作是当前线程所执行的字节码指令的行号指示器。

    Java 虚拟机栈: Java 虚拟机栈是一块线程私有的内存空间, Java 虚拟机栈主要存放 Java 方法执行过程中的局部变量表、操作数栈、动态链接、方法出口等信息。

    本地方法栈: 本地方法栈与 Java 虚拟机栈类似, 它是线程私有的内存空间, 本地方法栈主要用来保存 Native 方法, 所需要的信息,本地方法栈区域也会抛出StackOverflowError和OutOfMemoryError异常。

    Java 堆: Java 堆是 Java 虚拟机管理的内存中最大的一块内存空间, Java 堆是被所有线程共享的内存区域, 在 Java 堆中存放着 Java 对象, 引用类型(比如数组), 这样被回收的可能性就比较小了。

    方法区: 方法区是 Java 虚拟机管理的内存中的一块共享区域, 主要存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。