您的位置:首页 > 编程语言 > Java开发

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

2017-06-11 21:41 441 查看
本书结构:

从宏观的角度介绍了整个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异常调试程序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: