
jvm
文章平均质量分 79
一白丁
道阻且长,行则将至
展开
-
深入理解java虚拟机系列第三版读后小记:(十五)java线程安全
深入理解java虚拟机系列第三版读后小记:十五-java线程安全前言线程安全线程安全的“排序”线程安全的实现方法锁优化自旋锁和自适应自旋锁消除锁粗化轻量级锁偏向锁总结前言本文介绍一下java的线程安全的相关知识线程安全所谓线程安全即多个线程同时访问一个对象时,不考虑这些线程运行环境下的调度和交替执行,也不需要额外的同步,或者调用方进行任何的协调操作,调用这个对象的行为都可以获取正确结果,即可认为该线程是安全的。线程安全的“排序”通常java中线程“安全程度”由高到低体现主要分为以下五类:不可原创 2020-07-27 17:45:01 · 190 阅读 · 0 评论 -
深入理解java虚拟机系列第三版读后小记:(十四)java线程
深入理解java虚拟机系列第三版读后小记:十四 java线程前言线程简介内核线程的实现用户线程的实现混合实现线程调度协同式调度抢占式调度线程状态协程java目前线程环境存在的问题纤程总结前言本文将介绍线程的基础知识,包括线程状态,线程调度。线程简介相信读者都知道线程与进程的区别,进程由多个线程组成,线程可以共享进程资源,也可独立调度,目前线程也是java中进行处理器资源调度的最基本单位。线程的实现通常分三种内核线程的实现内核线程就是由操作系统的内核支持的线程,一版是为1:1模式,就是一一对应,原创 2020-07-27 11:48:08 · 157 阅读 · 0 评论 -
深入理解java虚拟机系列第三版读后小记:(十三)java内存模型与Volatile修饰符
深入理解java虚拟机系列第三版读后小记: 十三 java内存模型前言硬件的缓存一致性java内存模型内存操作指令前言本节开始进行到线程的一些知识,从jvm角度的去看如何处理线程。硬件的缓存一致性在了解java 内存模型之前,先了解一下物理机的解决并发的方式。jvm中的并发问题场景有很多与物理机的并发场景相似,所以参考物理机解决并发的问题有很大意义。首先,现在pc中几乎都是多核处理器,很少有单核处理器了,所以运行处理都是多线程并发执行的。其次,得了解一下内存的读写效率,作为存储器,毫无疑问cpu原创 2020-07-23 15:59:54 · 152 阅读 · 0 评论 -
深入理解java虚拟机系列第三版读后小记:(十二)运行时栈帧数据结构
深入理解java虚拟机系列第三版读后小记: 十二 运行时栈帧数据结构前言栈帧的各个区域局部变量表操作数栈动态连接方法返回地址附加信息方法调用解析分派静态分派动态分派单分派与多分派总结前言之前提到java内存布局的时候提到过虚拟机栈,其中虚拟机栈里存储的元素就是栈帧。栈帧存储了局部变量表,操作数栈,动态连接和方法返回地址等信息,每一方法从调用开始至执行结束的过程,就是虚拟机栈中的一个栈帧从入栈到出栈这个过程。上图展示的就是一个线程内的栈帧中的具体内容,接下来将会具体讲述栈帧中的具体区域。栈帧的原创 2020-06-18 22:59:47 · 258 阅读 · 0 评论 -
深入理解java虚拟机系列第三版读后小记:(十一)jvm的类加载器
深入理解java虚拟机系列第三版读后小记: 十一 jvm的类加载器前言类与类加载器双亲委派模型概念工作流程优点双亲委派的破坏第一次破坏第二次破坏第三次破坏模块思想总结前言本文将介绍一下java的类加载器,了解它的功能以及和类的关系。类与类加载器之前提到类被加载到jvm中的第一个阶段就是加载,而加载类的就是其类加载器,所以类与其类加载器共同确立了jvm中的唯一性,也就是说通常判断两个对象是否相等是的前提是由同一个类加载器加载的,如果两个对象外形一样但是由不同的类加载器加载,那两对象肯定不相等。双原创 2020-06-17 23:23:45 · 185 阅读 · 0 评论 -
深入理解java虚拟机系列第三版读后小记:(十)jvm的类加载过程
深入理解java虚拟机系列第三版读后小记: 十 jvm的类加载过程前言类的生命周期类加载到jvm的主要阶段加载类的时机加载验证准备解析初始化总结前言上文介绍了class的结构和字节码指令集,本文将介绍jvm的类加载过程。类的生命周期一个类从被加载到jvm的内存知道被jvm卸载出内存为止,一共要经历加载,验证,准备,解析,初始化,使用,卸载七个阶段,这七个阶段完整的构成了一个类的生命周期,其中验证,准备,解析这三个阶段统称连接。其中,加载,验证,准备,初始化,卸载的五个阶段顺序是确定的,解析有些场原创 2020-06-17 20:46:26 · 199 阅读 · 0 评论 -
深入理解java虚拟机系列第三版读后小记:(九)class结构与字节码
深入理解java虚拟机系列第三版读后小记:九 class结构与字节码前言class类文件结构字节码字节码指令类型存储和加载指令运算指令类型转换指令其它指令后话前言本文将简单介绍一下的class的结构与字节码,了解将有利于我们熟悉jvm的对类文件的处理机制。class类文件结构众所周知,java是支持一个跨平台的语言,其支持跨平台的功能重要原因之一就是它有一个规范标准的class文件。class文件是一个以8字节为基础的二进制流,各个项目严格紧凑顺序的排列在文件之中,也就是说没有空隙,没有分割符,原创 2020-06-15 16:27:50 · 239 阅读 · 0 评论 -
深入理解java虚拟机系列第三版读后小记:(八)jvm的常用术语解释
深入理解java虚拟机系列第三版读后小记:八-jvm的常用术语解释前言根节点枚举安全点抢先式中断主动式中断安全区域记忆集和卡表写屏障三色标记法总结前言之前文章中曾介绍过读写屏障,安全点,安全区域等一些名词,为此读者感到疑惑,所以特写此文解释一下。根节点枚举GC Roots的对象类型是固定的,所以任何一个垃圾回收器遍历寻找GC roots 都是需要进行STW的,但即使这样,一个方法区的对象多如牛毛循环遍历的话也是需要花费巨额的资源。所以出现了oopmap这一数据结构,在类加载进来的时候,就已经通过偏移原创 2020-06-11 17:43:42 · 298 阅读 · 0 评论 -
深入理解java虚拟机系列第三版读后小记:(七)低延迟垃圾收集器之ZGC收集器
深入理解java虚拟机系列第三版读后小记:七-低延迟垃圾收集器之ZGC收集器前言ZGC简介染色指针zgc的工作流程小结前言上文介绍了低延迟收集器中的Shenandoah收集器,本文将介绍另外一款低延迟的收集器ZGC收集器,如果说Shenandoah算是oracle jvm中的干儿子,那ZGC就是正统的亲儿子。ZGC简介同样作为低延迟收集器,两者之间还是有很多的相同点,同样是基于region的内存布局,不支持分代回收。但其差异也很明显,zgc的rigion具有动态性,可以动态创建和销毁。包括regi原创 2020-06-11 14:32:13 · 381 阅读 · 1 评论 -
深入理解java虚拟机系列第三版读后小记:(六)低延迟垃圾收集器之Shenandoah收集器
深入理解java虚拟机系列第三版读后小记:六 低延迟垃圾收集器之Shenandoah收集器前言Shenandoah简介Shenandoah工作流程转发指针后话前言上文笔者介绍了jvm上经典的垃圾收集,本文将继续介绍低延迟的Shenandoah收集器。介绍Shenandoah收集器之前,首先要明白衡量jvm性能的三大尺标:吞吐量,延迟性,内存占用。当然,任何一款垃圾收集器都无法同时满足三个尺标,同时最高只能满足两个。而如今互联网的爆炸发展,对于延迟性的要求越来越高,人们更关注于低延迟的重要性,所以传统的垃原创 2020-06-09 15:44:16 · 436 阅读 · 1 评论 -
深入理解java虚拟机系列第三版读后小记:(五)经典垃圾收集器
深入理解java虚拟机系列第三版读后小记-五 经典垃圾收集器前言正文Serial回收器优缺点parallel 回收器Parallel Scavenge收集器CMS回收器优缺点Garbage first 回收器总结前言上文中介绍了几种垃圾回收算法,本文将继续介绍实践垃圾回收算法的回收器。正文一图已概之上面三个全是年轻代回收器,下面三个全是老年代回收器。G1是基于堆回收的回收器。Serial回收器Serial回收器是最经典的回收器,分别有Serial , Serial Old,两者的区分就是回收原创 2020-06-04 17:28:04 · 261 阅读 · 0 评论 -
深入理解java虚拟机系列第三版读后小记:(四)垃圾收集算法
深入理解java虚拟机系列第三版读后小记:四 垃圾收集算法前言分代思想回收算法标记-清除算法标记-复制算法标记-整理算法后话前言上节介绍了jvm对java存活判断的两种方式,本文继续介绍垃圾收集算法。分代思想介绍垃圾收集算法之前,先介绍一下分代的思想。弱分代假说:大多对象都是朝生夕灭的。强分代假说: 熬过越多次垃圾收集的对象越难以被回收掉根据这个思想奠定了垃圾收集器的设计原则:收集器将堆划分不同的区域,然后将回收对象依据年龄(即对象熬过垃圾回收过程的次数)存储到不同区域。这样根据不同区域使用不原创 2020-05-28 11:29:37 · 214 阅读 · 0 评论 -
深入理解java虚拟机系列第三版读后小记:(三) java的死亡判断
深入理解java虚拟机系列第三版读后小记:三 java的死亡判断前言vm判断对象死亡的两种方式引用计数法可达性分析算法java的引用被判断死亡的java对象必死无疑?前言上文介绍了java对象在内存分配的区域,本文将介绍jvm如何判断对象是否存活。vm判断对象死亡的两种方式引用计数法jvm判断java对象是否死亡的两种算法之一就是引用计数法。引用计数法的原理也很简单:在对象里添加一个引用计数器,若有其他地方引用这个对象,该计数器加1,引用失效时就减1,当计数器为0时,说明该对象已死亡,无法再被使用原创 2020-05-21 21:12:13 · 270 阅读 · 0 评论 -
深入理解java虚拟机系列第三版读后小记:(二)jvm中的java对象
深入理解java虚拟机系列第三版读后小记:(二)jvm中的java对象前言java对象jvm中创建的过程概览分配内存的两种方式指针碰撞空闲列表分配内存的并发安全方案前言上文中笔者仔细讲述了jvm内存区域的划分和其职责以及各内存可能存在的溢出报错方式,本文将探究一个java对象在jvm中是如何存在和被分配的。java对象jvm中创建的过程概览创建一个java对象通常两种方式,使用new 关键字或者反射。那么创建对象时的过程是什么,大概分为以下几步:jvm 检查到new指令时,检查这个指令的参数是否原创 2020-05-16 23:19:03 · 180 阅读 · 0 评论 -
深入理解java虚拟机系列第三版读后小记:(一) java内存区域
@[TOC](深入理解java虚拟机系列第三版读后小记:(一) java内存区域)前言本文是笔者基于《深入理解java虚拟机系列:JVM高级特性与最佳实践第三版》所读的笔记和总结。jvm运行的内存数据区域jvm为了方便管理所以将其内存区域划分各个模块,每个模块有各自的功能和创建销毁的时间。程序计数器程序计数器占用的内存非常小,它的功能可以看做当前线程的字节码行号指示器。所谓字节码就是java类文件经过编译后以字节码的方式运行在jvm。有字节码就有字节码解释器,而解释器工作就是通过修改计数器来原创 2020-05-11 22:35:14 · 200 阅读 · 0 评论