• 深入理解 Java 虚拟机之学习笔记(1)


    本书结构:
    • 从宏观的角度介绍了整个Java技术体系、Java和JVM的发展历程、模块化,以及JDK的编译
    • 讲解了JVM的自动内存管理,包括虚拟机内存区域的划分原理以及各种内存溢出异常产生的原因
    • 分析了虚拟机的执行子系统,包括类文件结构、虚拟机类加载机制、虚拟机字节码执行引擎
    • 讲解了程序的编译与代码的优化,阐述了泛型、自动装箱拆箱、条件编译等语法糖的原理
    • 讲解了虚拟机的热点探测方法、HotSpot的即时编译器、编译触发条件,以及如何从虚拟机外部观察和分析JIT编译的数据和结果
    • 探讨了Java实现高效并发的原理,包括JVM内存模型的结构和操作,原子性、可见性和有序性在Java内存模型中的体现,先行发生原则的规则和使用,线程在Java语言中的实现原理,虚拟机实现高效并发所做的一些列锁优化措施。

    Java虚拟机运行时数据区如下图所示:

    第一个是程序计数器:标识机器码行号,进行跳转等操作,只需要修改程序计数器就可以实现。
    第二个是虚拟机栈:保存局部变量表,如果访问超过栈的深度,并且不支持动态扩展,因此报出StackOverFlowError,当前大多数虚拟机均支持虚拟机栈动态扩展,如果没有足够空间保存局部变量表则报出OutOfMemoryError.
    第三个是本地方法栈:本地方法栈未规定语言、使用方式、数据结构,因此具体的虚拟机可以自由实现它。同样和虚拟机栈一样抛出StackOverFlowError和OutOfMemoryError
    第四个是Java 堆:虚拟机启动时创建,唯一目的是存放对象实例。几乎所有的对象实例都在这里分配内存。Java堆是垃圾回收管理的主要区域。因此Java堆也称为“GC”堆(垃圾堆)。Java堆的细化,新生代和老年代。都是为了更好的回收内存,更快地分配内存。
    第五个为方法区:存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。别名 Non-Heap(非堆) 

    六个为运行时常量池:

    第七个是直接内存

    下一节为演示不同数据区域的OutOfMemoryError以及StackOverflowError异常调试程序。

  • 相关阅读:
    Alpha冲刺(5/10)
    Alpha冲刺(4/10)
    团队现场编程
    关于合同标准形的专题讨论
    关于相似标准形的专题讨论
    关于数学分析的计算题I(积分)
    关于数学分析的证明题III(级数)
    关于数学分析的证明题II(微分)
    关于数学分析的证明题I(积分)
    关于反常积分收敛的专题讨论
  • 原文地址:https://www.cnblogs.com/zpfbuaa/p/6986502.html
Copyright © 2020-2023  润新知