• 深入理解 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异常调试程序。

  • 相关阅读:
    【Shell】 计算文件 交集,并集和差集
    http协议--Apache-Httpd服务基本配置-rpm安装-编译安装(HTTP2.2,HTTP2.4)
    进程管理工具
    Linux系统原理(工作模式)
    网络协议和管理
    网络通信安全基础(加密方式,OpenSSL)
    BZOJ 2969 期望
    BZOJ 2118 Dijkstra
    BZOJ 1407 exgcd
    BZOJ 2406 二分+有上下界的网络流判定
  • 原文地址:https://www.cnblogs.com/zpfbuaa/p/6986502.html
Copyright © 2020-2023  润新知