Java虚拟机
纪莫
心中有光,人生总会晴朗。
展开
-
你说一下对Java中的volatile的理解吧,以及它是怎么保证可见性的。
前言volatile相关的知识其实自己一直都是有掌握的,能大概讲出一些知识,例如:它可以保证可见性;禁止指令重排。这两个特性张口就来,但要再往深了问,具体是如何实现这两个特性的,以及在什么场景下使用volatile,为什么不直接用synchronized这种深入和扩展相关的问题,就回答的不好了。因为volatile是面试必问的知识,所以这次准备把这部分也给啃掉。系统处理效率与Java内存模型在计算机中,每条程序指令都是在CPU中执行的,而CPU执行指令的数据都是临时存储在内存中的,但是CPU的执行速度原创 2020-11-05 23:56:07 · 922 阅读 · 1 评论 -
深入理解JVM(③)Java的锁优化
前言原创 2020-07-25 16:46:03 · 135 阅读 · 0 评论 -
深入理解JVM(③)再谈线程安全
前言我们在编写程序的时候,一般是有个顺序的,就是先实现再优化,并不是所有的牛P程序都是一次就写出来的,肯定都是不断的优化完善来持续实现的。因此我们在考虑实现高并发程序的时候,要先保证并发的正确性,然后在此基础上来实现高效。所以线程安全是高并发程序首先需要保证的。线程安全定义对于线程安全的定义可以理解为:当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那就称这个对象是线程原创 2020-07-15 23:21:35 · 208 阅读 · 0 评论 -
深入理解JVM(③)线程与Java的线程
前言我们都知道,线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源调度(内存地址、文件I/O等),又可以独立调度。线程的实现主流的操作系统都提供了线程实现,Jav语言则是提供了在不同硬件和操作系统平台下对线程操作的统一处理,每个已经调用过start()方法且还未结束的java.lang.Thread类的实例就代表这一个线程。其实Thread类与大部分的Java类库API有着显著差别,它的所有关键方法都被声明为Native。在Java中,原创 2020-07-11 12:05:50 · 316 阅读 · 0 评论 -
深入理解JVM(③)学习Java的内存模型
前言Java内存模型(Java Memory Model)用来屏蔽各种硬件和操作系统的内存访问差异,这使得Java能够变得非常灵活而不用考虑各系统间的兼容性等问题。定义Java内存模型并非一件容易的事情,从Java出生开始经过长时间的验证和修补,直至JDK5发布后Java内存模型才终于成熟、完善起来了。主内存与工作内存Java内存模型的主要目的是定义程序中各种变量的访问规则,即关注在虚拟机中把变量值存储到内存和从内存中取出变量值这样的底层细节。Java内存模型规定了所有变量都存储在主内存(Main原创 2020-07-09 08:12:19 · 285 阅读 · 0 评论 -
深入理解JVM(③)Java模块化系统
前言JDK9引入的Java模块化系统(Java Platform Module System ,JPMS)是 对Java技术的一次重要升级,除了像之前JAR包哪有充当代码的容器之外,还包括:依赖其他模块的列表。导出的包列表,即其他模块可以使用的列表。开放的包列表,即其他模块可反射访问模块的列表。使用的服务列表。提供服务的实现列表。模块化系统可配置的封装隔离机制解决了原来类路径上跨文件的public类的可访问性的问题。public类型不再意味着所有地方代码都可以访问它们,未导出和未开放的类原创 2020-06-30 23:29:09 · 459 阅读 · 0 评论 -
深入理解JVM(③)虚拟机的类加载器(双亲委派模型)
前言先解释一下什么是类加载器,通过一个类的全限定名来获取描述该类的二进制字节流,在虚拟机中实现这个动作的代码被称为“类加载器(Class Loader)”。类与类加载器类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远超类加载阶段。每个类加载器都有一个独立的类名称空间,所以每个类唯一性都必须是建立在是否为同一个类加载器的前提下的。否则,即使是两个类来源于同一个Class文件,被同一个Java虚拟机加载,只要加载它们的类加载器不同,那这两个类就必定不相等。例如:public c原创 2020-06-28 19:00:23 · 206 阅读 · 0 评论 -
深入理解JVM(③)虚拟机的类加载过程
前言上一篇我们介绍到一个类的生命周期大概分7个阶段:加载、验证、准备、解析、初始化、使用、卸载。并且也介绍了类的加载时机,下面我们将介绍一下虚拟机中类的加载的全过程。主要是类生命周期的,加载、验证、准备、解析和初始化这五个阶段所执行的具体动作。加载类加载过程的第一个阶段就是加载,在加载阶段,Java虚拟机需要完成以下三件事情:1. 通过一个类的全限定名来获取定义此类的二进制字节流。2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。3. 在内存中生成一个代表这个类的java.la原创 2020-06-27 15:12:52 · 136 阅读 · 0 评论 -
深入理解JVM(③)类是在什么时候进行加载的?
前言Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称为虚拟机的类加载机制。类加载的时机一个类型从被加载到虚拟机内存中开始,到卸载除内存为止,它的生命周期将会经历加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和 卸载(Unloading)、七个阶段,其中验证、准备、解析三个部原创 2020-06-24 18:08:04 · 1051 阅读 · 1 评论 -
深入理解JVM(③)虚拟机性能监控、故障处理工具
前言JDK的bin目录中有一系列的小工具,除了java.exe、javac.exe这两个编译和运行Java程序外,还有打包、部署、签名、调试、监控、运维等各种场景都会用到这些小工具。原创 2020-06-22 23:00:57 · 201 阅读 · 0 评论 -
深入理解JVM(③)ZGC收集器
前言ZGC是一款在JDK11中新加入的具有实验性质的低延迟垃圾收集器,目前仅支持Linux/x86-64。ZGC收集器是一款基于Region内存布局的,(暂时)不设分代的,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-整理算法的,以低延迟为首要目标的一款垃圾收集器。ZGC布局与Shenandoah和G1一样,ZGC也采取基于Region的堆内存布局,但与他们不同的是,ZGC的Region具有动态性(动态的创建和销毁,以及动态的区域容量大小)。ZGC的Region可以分为三类:小型原创 2020-06-20 20:28:55 · 596 阅读 · 0 评论 -
深入理解JVM(③)低延迟的Shenandoah收集器
Shenandoah作为第一款不由Oracle(包括一起的Sun)公司的虚拟机团队所领导开发的HotSpot垃圾收集器。是只存在于OpenJDK当中的,最初由RedHat公司创建的,在2014年的时候贡献给了OpenJDK。与G1相比的优点从代码的历史渊源上来看,Shenandoah收集器更像是G1的下一代继承者,两者相似的堆内存布局,在初始标记、并发标记等许多阶段的处理思路都高度一致。但是Shenandoah相比G1还是至少有三个明显的不同之处。1、支持并发的整理算法,G1的回收阶段是可以多线程并原创 2020-06-17 22:14:27 · 952 阅读 · 4 评论 -
深入理解JVM(③)经典的垃圾收集器
前言如果说垃圾收集算法是内存回收的方法论,那垃圾收集器就是内存回收的实践者。本次要介绍的是几款“经典”的垃圾收集器,之所以被称之为“经典”,是为了与几款目前仍处于实验状态,但是执行效果上哟革命性改进的高性能低延迟收集器区分开来,虽然算不上最先进的技术,但却是在实践中千锤百炼,足够成熟,可以在商用生产环境上放心使用的全部垃圾收集器。这些“经典”收集器之间的关系图这七种作用于不同分代的收集器,如果两个之间存在连续,说明可以搭配使用。目前这些垃圾收集器并不都是“万能”的,所以针对于各个垃圾收集器,我们的目原创 2020-06-14 19:47:36 · 240 阅读 · 0 评论 -
深入理解JVM(③)各种垃圾收集算法
前言从如何判定对象消亡的角度出发,垃圾收集算法可以划分为“引用计数式垃圾收集”(Reference Counting GC)和“追踪式垃圾收集”(Tracing GC)两大类,这两类也常被称作“直接垃圾收集”和“间接垃圾收集”。由于束流Java虚拟机中使用 的都是“追踪式垃圾收集”,所以后续介绍的垃圾收集算法都是属于追踪式的垃圾收集。分代式收集理论当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”的理论进行设计。主要简历在两个分代假说之上:1、弱分代假说:绝大多数对象都是“朝生夕灭”的。2、原创 2020-06-11 22:50:04 · 116 阅读 · 0 评论 -
深入理解JVM(③)JVM运行时数据区域
前言Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时机,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的穷的和结束而建立和销毁。Java虚拟机将其管理的内存分为以下几个运行时区域。程序计数器程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。由于Java虚拟机...原创 2020-03-22 23:02:49 · 226 阅读 · 0 评论 -
深入理解JVM(③)HotSpot虚拟机对象探索
对象的创建Java是一门面向对象的编程语言,在Java程序的运行过程中每时每刻都有对象被创建出来,那么在虚拟机中,对象的创建是怎样的一个过程呢?当Java虚拟机遇到一条字节码new指令时,首先检查这个指令的参数是否能定位到一个类的符号引用,然后检查原创 2020-06-02 22:05:03 · 163 阅读 · 0 评论 -
深入理解JVM(③)判断对象是否还健在?
前言因为Java对象主要存放在Java堆里,所以垃圾收集器(Garbage Collection)在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(不被引用了)。判断对象是否健在的算法引用计数算法引用计数算法,很容易理解,在对象中添加一个引用计数器,每有一个地方引用它时,计数器值就加一;当引用失效是,计数器值就减一;任何时刻计数器为零的对象就是不可以能再被使用的对象。引用计数算法的原理简单,判定效率也很高。市面上也确实有一些技术使用的此类算法来判定对象是原创 2020-06-06 17:57:29 · 257 阅读 · 0 评论