![](https://img-blog.csdnimg.cn/20190918140129601.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JVM
本专栏围绕Java虚拟机进行知识点的学习和深入,结合工作经验,再次学习相信会有更好的理解。
好好生活_
这个作者很懒,什么都没留下…
展开
-
深入理解Java虚拟机(十一):各种锁概述
引言在上一篇文章《深入理解Java虚拟机(十):线程安全问题和实现方法》中,我们提到了线程安全,不论是使用synchronized关键字或是使用Lock实现类等方法去保证线程安全,最核心的点就在于“锁”。在Java并发编程中,有很多关于锁的名词,例如:乐观锁、悲观锁、可重入锁、自旋锁、轻量级锁等等,本篇文章将会逐个总结,各种锁的含义,看这一篇文章就够了!分类在详细解释各种锁之前,我们先从宏观上把握,从不同的角度,将各种锁进行划分整理一下。从线程是否要锁住同步资源角度,可以分为乐观锁和悲观锁。根原创 2020-07-27 16:19:03 · 322 阅读 · 1 评论 -
深入理解Java虚拟机(十):线程安全问题和实现方法
引言当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那就称这个对象是线程安全的。Java中的线程安全按照线程安全的“安全程度”由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下五类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。1. 不可变在Java语言里面(特指JDK 5以后,即Java内存模型被修正之后的Java语言),不可变(Immu原创 2020-07-21 18:43:10 · 388 阅读 · 0 评论 -
深入理解Java虚拟机(九):Java内存模型(Java Memory Model,JMM)
引言《Java虚拟机规范》中曾试图定义一种“Java内存模型”(Java Memory Model,JMM)来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。定义Java内存模型并非一件容易的事情,这个模型必须定义得足够严谨,才能让Java的并发内存访问操作不会产生歧义;但是也必须定义得足够宽松,使得虚拟机的实现能有足够的自由空间去利用硬件的各种特性(寄存器、高速缓存和指令集中某些特有的指令)来获取更好的执行速度。经过长时间的验证和修补,直至JDK 5原创 2020-07-21 10:45:22 · 327 阅读 · 0 评论 -
深入理解Java虚拟机(八):类加载器与双亲委派模型
引言Java虚拟机设计团队有意把类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器”(Class Loader)。类与类加载器类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远超类加载阶段。对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。通俗地说,比较两个类是否“原创 2020-07-13 18:18:11 · 262 阅读 · 0 评论 -
深入理解Java虚拟机(七):虚拟机的类加载机制
引言Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。类加载时机一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)七个阶段,其中验证、准备、解析三个部分原创 2020-07-08 20:36:49 · 263 阅读 · 0 评论 -
深入理解Java虚拟机(六):内存回收实践者——经典垃圾收集器
引言《Java虚拟机规范》中对垃圾收集器应该如何实现并没有做出任何规定,因此不同的厂商、不同版本的虚拟机所包含的垃圾收集器都可能会有很大差别,不同的虚拟机一般也都会提供各种参数供用户根据自己的应用特点和要求组合出各个内存分代所使用的收集器。收集器概览上图展示了七种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。收集器划分收集器可划分为并行和并发两种。并行(Parallel):并行描述的是多条垃圾收集器线程之间的关系,说明同一时间有多条这样的线程在协同工作,通常默原创 2020-06-22 20:46:37 · 251 阅读 · 0 评论 -
深入理解Java虚拟机(五):内存回收方法论——垃圾收集算法
引言从如何判定对象消亡的角度出发,垃圾收集算法可以划分为“引用计数式垃圾收集”(Reference Counting GC)和“追踪式垃圾收集”(Tracing GC)两大类,这两类也常被称作“直接垃圾收集”和“间接垃圾收集”。下面总结的算法均属于追踪式垃圾收集的范畴。分代收集理论相关名词部分收集(Partial GC):指目标不是完整收集整个Java堆的垃圾收集,其中又分为:1)新生代收集(Minor GC/Young GC):指目标只是新生代的垃圾收集。2)老年代收集(Major GC/原创 2020-06-18 11:51:49 · 301 阅读 · 0 评论 -
深入理解Java虚拟机(四):关于对象
引言在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(“死去”即不可能再被任何途径使用的对象)了。判断方法1. 引用计数算法?很多教科书判断对象是否存活的算法是这样的:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。但是,在Java领域,至少主流的Java虚拟机里面都没有选用引用计数算法来管理内存,主要原因是,原创 2020-06-09 20:22:44 · 289 阅读 · 0 评论 -
深入理解Java虚拟机(三):实战OutOfMemoryError异常
引言在系列文章的第一篇中,我们就了解到,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(下文称OOM)异常的可能。本篇博客将通过代码示例来再现异常情景,最后也会总结若干最基本的与自动内存管理子系统相关的HotSpot虚拟机参数。异常场景首先,我们可以在开发工具中设置一些JVM运行参数,如最大堆、最小堆等,这对示例代码的结果会有直接影响。以IDEA开发工具来说,我们在Edit Configurations对话框中的VM Options一项中进行设置,如下:1原创 2020-06-09 15:42:19 · 234 阅读 · 0 评论 -
深入理解Java虚拟机(二):HotSpot虚拟机对象探秘
引言通过上篇博客,我们已经了解了Java虚拟机的内存区域的划分及每个区域存储的内容,那么,本篇博客将以HotSpot虚拟机和内存区域Java堆为例,继续深入了解内部是如何创建、布局和访问的。探秘之旅1. 对象的创建Java是一门面向对象的编程语言,Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,仅仅是一个new关键字而已,而在虚拟机中,又是怎样一个过程呢? 1) 检查,如果没有被加载、解析和初始化过,执行类加载过程当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的原创 2020-05-27 22:10:31 · 381 阅读 · 0 评论 -
深入理解Java虚拟机(一):Java虚拟机内存区域介绍
引言对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出问题,看起来由虚拟机管理内存一切都很美好。不过,也正是因为Java程序员把控制内存的权力交给了Java虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那排查错误、修正问题将会成为一项异常艰难的工作。本篇博客开始,将在《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》一书的引导下,开启Java虚拟机学习之旅。运原创 2020-05-27 17:09:24 · 407 阅读 · 0 评论