![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
深入理解java虚拟机(第二版)
with_dream
这个作者很懒,什么都没留下…
展开
-
虚拟机字节码执行引擎
1、运行时栈帧结构栈帧是支持虚拟机进行方法调用和方法执行的数据结构,栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等。每一个方法从调用开始到执行完成的过程,都是一个栈帧在虚拟机栈入栈、出栈的过程。一个线程中的方法调用链可能很长,很多方法处于执行状态。但是对于虚拟机来说,在活动线程中,只有处于栈顶的栈帧才是有效的,称为当前栈帧,与这个栈帧相关联的方法叫做当前方法。执行引擎运行的所有字节码原创 2017-08-17 11:09:12 · 175 阅读 · 0 评论 -
java内存模型与线程
1、java内存模型1.1 主内存与工作内存java内存模型的主要目标是定义程序中各变量的访问规则。这里的变量指实例字段、静态字段、构成数组对象的元素,但不包括局部变量、方法参数。 java内存模型规定所有变量都放在主内存,每条线程都有自己的工作内存,工作内存相互独立。工作内存存放当前用到的变量的主内存的副本,线程对变量的操作(赋值、读取)都是在工作内存中,不能在主内存中。各线程间变量值的传递都是原创 2017-08-17 17:45:24 · 178 阅读 · 0 评论 -
线程安全和锁优化
1、线程安全的实现方法1.1 互斥/同步 synchronized/java.util.concurrect包1.2 非阻塞同步 CAS操作 如原子变量操作1.3 无同步方案 可重入代码:如果一个方法,它的返回结果是可预测的,只要输入了相同的数据,就都能返回相同的结果,就是可重入的。 线程本地存储:ThreadLocal2、锁优化2.1 自旋锁/自适应自旋锁互斥同步对性能最大的影响是阻塞的实原创 2017-08-18 01:25:22 · 169 阅读 · 0 评论 -
第二章--java内存区域与内存溢出
1、运行时数据区域java的运行时区域包括公共部分的方法区、堆区 以及线程私有的虚拟机栈、本地方法栈、程序计数器。1.1 程序计数器程序计数器是一块较小的内存空间,它是当前线程所执行字节码行号的指示器。每条线程的计数器都是独立的,互不干扰 如果线程执行的是java方法,则计数器记录的是正在执行的字节码指令地址。如果是native方法,则计数器的值为空1.2 java栈java栈是线程私有的,生命周原创 2017-08-14 17:34:00 · 196 阅读 · 0 评论 -
垃圾收集器与内存分配策略
1、判断对象是否需要回收 1.1 引用计数法 为对象添加一个引用计数器,有地方引用它时,计数器+1。当引用失效时,计数器-1。当计数器值为0时,表示对象不再被应用,可以回收。 引用计数法简单、效率高 但是对于两个对象互相引用,容易造成内存泄漏 1.2 可达性分析算法 使用一系列根节点(GC Root)的对象作为起始点,向下搜索,搜索所走过的路径称为引用链。当一个对象到根节点不可...原创 2017-08-15 01:24:18 · 151 阅读 · 0 评论 -
类文件结构
1 class类文件结构class类文件是一组以8位字节为基础的二进制流。当遇到大于8字节的数据时,将高位在前 分割为多个8字节数据。类文件只有无符号数和表组成。无符号数是基本数据类型,有u1,u2,u4,u8,分别占1,2,4,8字节。可以描述数字,索引引用,数量值等 表由无符号数和其他表组成。习惯以_info结尾。1.1 magic 魔数class文件的头四个字节称为魔数,唯一的作用是确定这原创 2017-08-15 17:31:38 · 181 阅读 · 0 评论 -
虚拟机类加载机制
1、类加载时机类从被加载到被卸载,经历了加载->验证->准备->解析->初始化->使用->卸载 7个阶段。其中验证、准备、解析统称为连接 加载、验证、准备、初始化、卸载的顺序是固定不变的。而解析在某些情况下可能在初始化之后才开始,这是为了支持java的运行时绑定机制。遇到以下条件,将立即对类初始化: ①遇到new(使用new实例化对象)、putstatic/getstatic(读写一个静态变量)原创 2017-08-16 10:40:22 · 197 阅读 · 0 评论