深入理解java虚拟机

第一章 走进java

技术体系包含:
1.Java 程序设计语言
2.各种硬件平台上的java虚拟机
3.Class文件格式
4.Java API类库
5.来自商业机构和开源社区的第三方java类库
1,2,4 统称JDK,支持java开发的最小环境
2,4 统称JRE,java运行标准环境

java体系分为4个平台

java card java me java se java ee

第二部分 自动内存管理机制

java与C++之间有一堵由内存动态分配和垃圾回收技术所围城的高墙,墙外面的人想进入,墙里面的人却想出来.

第二章 java内存区域与内存溢出异常

image.png

1.程序计数器(线程私有):当前线程所执行的字节码的行号指示器.通过改变这个值来选取下一条需要执行的字节码指令.唯一没有规定任何OutOfMemoryError情况的区域

  1. java虚拟机栈(线程私有):生命周期与线程相同.
    存放局部变量表:基本数据类型行,对象引用,returnAddress(指向了一条字节码指令的地址)
    这个区域规定了两种异常:
    (1)线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常.
    (2).如果虚拟机栈可以动态扩大,当扩展无法申请到足够的内存时会抛出OutOfMemoryError异常.
    3.本地方法栈:与虚拟机栈相似,"虚拟"为虚拟机执行java代码服务."本地"为虚拟机使用的Native方法服务.也会抛出两个异常.
    4.堆(线程共享):存放对象实例(数组) 垃圾回收主要区域,也称GC堆.抛出OutOfMemoryError异常.
    5.方法区(线程共享):存放虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码.垃圾回收主要回收常量池,类型卸载.虚拟机规范规定,当方法区无法满足内存分配,抛出OutOfMemoryError.

对象访问

Object object = new Object();
内存泄漏: 不需要的对象,但与根目录有连接,无法被回收.
内存溢出:对象必须都活着,调大虚拟机堆参数 -Xmx 与 -Xms,检测对象是否1生命周期过长,持有状态时间过长.


image.png

第三章 垃圾回收

垃圾回收三件事:
1.哪些内存需要回收
2.什么时候回收
3.如何回收
主要考虑 java堆和方法区,因为其他内存区域随着线程生灭
1.引入计数算法 (java并没有使用)
2.根搜索算法
通过GC root的对象作为起点,向下搜索,搜索路径称为引用链,当对象到GC root不可达,则证明此对象不可用,可以被回收.
GC root对象 包括以下几种:
1.虚拟机栈 (栈帧中的本地变量表)中的引用对象
2.方法区 类静态属性引用的对象
3.方法区: 常量引用的对象
4.本地方法栈中JNI(即一般说的Native)的引用的对象
垃圾回收算法:
复制
标记-清理

第四章 虚拟机性能监控与故障处理工具

  给一个系统定位问题,知识,经验是关键基础,数据是依据,工具是运用知识处理数据的手段.
   数据: 运行日志, 异常推栈,GC日志,线程快照(threaddump / javacore),推转储快照(heapdump / hprof)

java 转化为 class 文件(编译过程)
解析与填充符号表过程
插入式注解处理器的注解处理过程
分析与字节码生成过程


image.png

高效并发

虚拟机如何实现多线程,多线程之间由于共享和竞争数据而导致的一系列问题及解决方案.

物理计算机并发问题

储存设备 慢
处理器 快 为此加入读写速度快的高速缓存(处理完同步回主内存) -- 缓存一致性
多个处理器 多个高速缓存 共享一主内存,为解决这个问题,需要遵守一些协议.


image.png

java 内存模型(Java Memory Modle JMM )

内存模型目标: 程序中各个变量(实例字段,静态字段,构成数组对象的元素,不包括局部变量与方法参数,后者线程私有)的访问规则.


image.png

image.png

工作内存 和主内存之间的交互协议定义了8种操作:

1.lock锁: 作用于主内存的变量,标识变量为一条线程独占的状态
2.unlock(解锁): 作用于主内存变量,解放处于锁定状态的变量
3.read(读取): 作用于主内存变量,把变量值主内存--->线程的工作内存,以便随后的load动作使用.

  1. load(载入): 作用于工作内存变量,把read操作从主内存拿得变量值放入工作内存的变量副本中.
    5.use(使用) : 工作内存 变量, 变量值---传递--执行引擎,每当虚拟机遇到一个需要使用到变量的值的字节码指令时将会执行这个操作.
    6.assign(赋值): 工作内存变量,执行引擎接受到的值赋值给工作内存变量.
    7.store(储存): 工作内存变量,工作内存---到--主内存 以便随后write操作使用.
    8.write(写入): 主内存的变量,将变量放入主内存变量中.


    image.png

    322 仔细阅读
    340页仔细阅读

第13章 线程安全与锁优化

线程安全: 当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象就是线程安全的.
操作共享数据分为五类:
不可变: 一定线程安全(例如final) Stirng 对象行为不会对其状态产生任何影响 保证对象: 将对象的状态声明为final
绝对线程安全:
相对线程安全:
线程兼容:
线程对立:

推荐阅读更多精彩内容