JVM深入学习
文章平均质量分 76
JVM是一个让人望而却步的东东,做为一个有志向的Java开发人员深入学习它是非常有必要的~~所以接下来准备一点点剖开它神秘的面纱~
webor2006
码农一个,记录个人成长的点滴~~
展开
-
JVM锁分析与字节码阐述
前言:距离上一次ThreadLocal内存泄露问题本质分析与代码编写最佳实践 - cexo - 博客园JVM的学习转眼已经间隔1年多了。。对于它的探索还是得继续,上次通过三连篇对于ThreadLocal进行了一个全面的剖析:这次则来对同步锁从JVM的角度对它进行一个探讨,说实话,在之前synchronized关键字所生成的字节码详细分析 - cexo - 博客园JVM的学习中就已经深入的对锁在字节码的底层进行了详细的学习,那此次相当于是一个复习,因为从大标题上看又是从字节层面来对JVM的锁进行一原创 2021-09-28 10:03:39 · 209 阅读 · 0 评论 -
软引用示例演示与引用队列的作用分析
继续延着上一次https://www.cnblogs.com/webor2006/p/12105080.html的Reference的官方文档进行阅读:下面来看一下discovered这个字段的定义:ReferenceQueue:下面来大致瞅下它:软引用示例演示:以上对于Reference类有了一个大概的认识之后,接下来则用一个软引用的具体实例来用下它,不过在正式写代码之前先来...原创 2019-12-27 23:41:00 · 130 阅读 · 0 评论 -
Reference的四种状态转换关系分析
在上一次https://www.cnblogs.com/webor2006/p/12076960.html中对于四大引用的强引用进行了学习,接下来三种引用分别是软引用(soft reference)、弱引用(weak reference)、虚引用(phantom reference),而引用的力度是从强到弱,在日常开发中这三种可能用得较少一些,这三种引用其实都对应一个Java类,软引用是Soft...原创 2019-12-26 23:18:00 · 229 阅读 · 0 评论 -
强引用分析及在实际开发中的注意事项
在N年前在面试时就被问到Java的四种引用【强、软、弱、虚】的区别,而当时也是临时抱佛脚,在网上搜一些相关的博客来对其概念进行了解,随着撸码职业生涯的变长,也对这四种引用的特点大脑里面已经形成了一个固定思维了,对其使用场景也或多或少有些了解了,比如当时Android里面对于图片的加载都会用到ImageLoader,里面就使用了软引用来避免内存溢出,而我们在有些类中需要对Activity进行引用时...原创 2019-12-21 15:02:00 · 97 阅读 · 0 评论 -
说说openjdk及G1回收器日志内容详细分析
谈谈openjdk:在正式往下学习JVM之前,这里谈谈openjdk这个网站,这个在学习java并发时也用过它来分析过锁的底层实现,如:https://www.cnblogs.com/webor2006/p/11442551.html,为啥要说它,目前学习JVM已经记录了80多篇了,从纯小白到目前的学习貌似对JVM有东东了解得还不错了,但是!!其实还只是了解了个冰山一角,主要是JVM是一个太...原创 2019-11-08 16:24:00 · 240 阅读 · 0 评论 -
SATB的标记问题解决之道与G1垃圾收集模式系统详解及最佳实践
继续接着上一次https://www.cnblogs.com/webor2006/p/11148282.html的理论学习,上一次学习到了这:接着继续:SATB详解:对于三色算法在concurrent的时候可能产生的漏标记问题,SATB在marking阶段中,对于从gray对象移除的目标引用对象标记为gray,对于black引用的新产生的对象标记为blcak;由于是在开始的时候进行sn...原创 2019-07-10 22:17:00 · 184 阅读 · 0 评论 -
SATB深入详解与问题剖析【纯理论】
延着上一次【https://www.cnblogs.com/webor2006/p/11147893.html】的理论继续。SATB:在G1中,使用的是SATB(Snapshot-At-The-Beginning)的方式,删除的时候记录所有的对象。它有3个步骤【重要!】:1、在开始标记的时候生成一个快照图,标记存活对象。2、在并发标记的时候所有被改变的对象入队(在write barrie...原创 2019-07-07 22:26:00 · 186 阅读 · 0 评论 -
三色标记算法在并发情况下的漏标问题分析【纯理论】
还是延着上一次【https://www.cnblogs.com/webor2006/p/11147545.html】的理论继续前行。。上一次学到这了:下面来看一下三色标记算法的整个过程:根对象被置为黑色,子对象被置为灰色。如下图:其中可以看到灰色对象是已经被扫描过了,但是灰色对象里面所引用的子对象还未被扫描,所以可以看到灰色对象指向了未被扫描过的白色对象。...原创 2019-07-07 21:23:00 · 135 阅读 · 0 评论 -
G1混合式GC与三色标记算法详解【纯理论】
继续基于上一次https://www.cnblogs.com/webor2006/p/11146273.html的理论进一步了解G1。G1收集概览:G1算法将堆划分为若干个区域(Region),它仍然属于分代收集器。不过,这些区域的一部分包含新生代,新生代的垃圾收集依然采用暂停所有应用线程的方式,将存活对象拷贝到老年代或者Survivor空间。老年代也分成很多区域,G1收集器通过将对象从一个...原创 2019-07-07 20:25:00 · 212 阅读 · 0 评论 -
G1垃圾收集器深度理论讲解【纯理论】
在上三次中对于G1官方解读之后,接下来还得回到G1的理论化知识的了解阶段。。确实G1是概念比较复杂,而且它也是未来JDK的垃圾回收的主流,所以花再多的时间在这上面也是值得的,先来回顾一下上次过过的理论在哪打止了:https://www.cnblogs.com/webor2006/p/11129572.html下面继续:G1相对于CMS的的优势:G1在压缩空间方面有优势。对于CMS是采用...原创 2019-07-07 14:49:00 · 113 阅读 · 0 评论 -
G1垃圾收集器系统化说明【官方解读】
还是继续G1官网解读,上一次已经将这三节的东东读完了,如下:所以接一来则继续往下读:Reviewing Generational GC and CMS【回顾一下CMS收集器】The Concurrent Mark Sweep (CMS) collector (also referred to as the concurrent low pause collector) collects...原创 2019-07-06 15:19:00 · 138 阅读 · 0 评论 -
G1垃圾收集器原理剖析【官方解读】
继续基于上一次https://www.cnblogs.com/webor2006/p/11135005.html的官方G1文档进行解读,上一次分析到了这:话不多说,继续往前读:When performing garbage collections, G1 operates in a manner similar to the CMS collector. G1 performs a co...原创 2019-07-06 14:01:00 · 135 阅读 · 0 评论 -
G1垃圾收集器官方文档透彻解读【官方解读】
在前几次中已经对G1的理论进行了一个比较详细的了解了,对于G1垃圾收集器最权威的解读肯定得上官网,当咱们将官网的理解透了,那基本上网上对于G1的说明其实最终都是来自于官网,所以接下来会详细来解读Oracle官网对于G1垃圾收集器的权威说明,其网址为:“https://www.oracle.com/technetwork/tutorials/tutorials-1876574.html”,打开如下...原创 2019-07-04 21:24:00 · 241 阅读 · 0 评论 -
G1垃圾收集器角色划分与重要概念详解【纯理论】
继续接着上一次【https://www.cnblogs.com/webor2006/p/11129326.html】对G1进行理论化的学习,上一次学到了G1收集器的堆结构,回忆下:接着继续对它进行了解:G1收集器堆结构:G1使用了gc停顿可预测的模型,来满足用户设定的gc停顿时间,根据用户设定的目标时间,G1会自动地选择哪些region要清除,一次清除多少个region。G1从多个r...原创 2019-07-03 22:41:00 · 90 阅读 · 0 评论 -
G1垃圾收集器堆内存划分与角色分派【纯理论】
接着上一次【https://www.cnblogs.com/webor2006/p/11123522.html】G1学习继续开启理论之旅。。G1的设计规划是要替换掉CMS【理想化的】G1在某些方面弥补了CMS的不足,比如,CMS使用的是mark-sweep算法,自然会产生内存碎片;然而G1基于copying算法,高效的整理剩余内存,而不需要管理内存碎片。另外,G1提供了更多手段,以达到对...原创 2019-07-03 21:49:00 · 93 阅读 · 0 评论 -
G1垃圾收集器设计目标与改良手段【纯理论】
在之前已经详细对CMS垃圾回收器进行了学习,今天准备要学习另一个全新的垃圾收集器---G1(Garbage First Collector 垃圾优先的收集器),说是一种全新的,其实G1垃圾收集器已经出现了N多年了,只是从发展到成熟是需要经历一定的过程,oracle官方计划在jdk9中将G1变成默认的垃圾收集器,以替代CMS, 可见G1肯定有它独特的地方,它跟我们之前所学的各种垃圾底层是完全不一样...原创 2019-07-02 22:22:00 · 87 阅读 · 0 评论 -
实例透彻分析CMS垃圾收集器执行过程
CMS收集器收集步骤:在上一次【https://www.cnblogs.com/webor2006/p/11055468.html】中已经对CMS的垃圾收集器有了一定的理论上的了解,其中提到了CMS收集器完整的七个步骤,这一次则对每一个步骤进行一个详细了解,并会用程序来理解这七个步骤。Phase1 :Initial Mark【初始标记】这个是CMS两次stop-the-world事件的其中...原创 2019-06-30 16:25:00 · 107 阅读 · 0 评论 -
CMS垃圾收集器深入详解
上一次【https://www.cnblogs.com/webor2006/p/11048407.html】对安全点和安全区进行了理论化的了解,接下来继续对CMS进行其它理论的了解,还是纯理论!!坚持,因为下一次就会有实践代码了~~CMS收集器CMS(Concurrent Mark Sweep)收集器,以获取最短回收停顿时间【也就是指Stop The World的停顿时间】为目标,多数应用...原创 2019-06-19 22:39:00 · 94 阅读 · 0 评论 -
安全点与安全区域详解
对于之前GC垃圾收集器的学习回忆【https://www.cnblogs.com/webor2006/p/10982448.html】一下都有哪些垃圾收集器:接下来则会对CMS这种超级复杂的一个垃圾回收器进行一个学习,相比serial收集器还是parallel收集器,CMS这种收集器无论是在处理的阶段上,还是在它的实现的复杂性上,都远远的要超过我们之前所接触过的各种各样的其它垃圾回...原创 2019-06-18 22:52:00 · 149 阅读 · 0 评论 -
实例演示MaxTenuringThreshold参数及阈值动态调整策略
在上一次【https://www.cnblogs.com/webor2006/p/11031563.html】学习了一个新的JVM对象晋升到老年代的参数“MaxTenuringThreshold”,它的具体作用回忆一下:简单来说就是用来控制哪些对象的年龄超过了这个最大值就会晋升到老年代,而对于对象晋升的参数其实在之前还有一个类似的【https://www.cnblogs.com/webor2...原创 2019-06-16 16:37:00 · 282 阅读 · 0 评论 -
MaxTenuringThreshold与阈值的动态调整理论详解
今天会学习“MaxTenuringThreshold”这样一个新的JVM参数,编写的示例还是会基于上一次的代码,新建个类,如下:接下来给它设置JVM的参数,具体如下:而接下来会新增三个参数:这个在之前已经使用过,只是木有配置到JVM参数中,回忆下:其实就是打印出JVM的启动参数,接下来再添加两个新的参数:那这俩参数的含义是啥呢?下面来对它们有个认识:-XX:MaxTenur...原创 2019-06-16 14:57:00 · 268 阅读 · 0 评论 -
阈值和垃圾收集器类型对于对象分配的影响实战分析
在上一次【https://www.cnblogs.com/webor2006/p/10990736.html】中实验了一个从新生代到老年代竞升的情况,得出一个这样的结果,回忆下:其实对于JVM来说,它提供了相应的一些参数来指定对象达到了多少的时候直接就可以在老年代分配而不是在新生代来分配,新生代是喜欢小的而且生命短暂的对象,所以下面来做实验,先新建一个类,示例代码基本上跟上一次类似:接下...原创 2019-06-14 22:50:00 · 88 阅读 · 0 评论 -
新生代与老年代垃圾收集器实现详解
在上一节【https://www.cnblogs.com/webor2006/p/10989175.html】中已经开启GC的第一次实践,这次继续其于上一次的例子进行扩展来阐述一些其它的知识,先回顾一下上一节的代码:其中GC参数我们配置如下:其中对于试验代码中为啥要选用字节数组来实验其实是有原因的,因为如果用int的话它占用4个字节还存在换算的因素存在,而byte则就占一个字节,所以用它...原创 2019-06-08 15:01:00 · 99 阅读 · 0 评论 -
垃圾回收日志与算法深度解读
经过前面对于JVM垃圾回收学习了纯理论相关的东东,这次则要开始用代码编写大量的实验来对理论进行佐证,下面开始,先在IntelliJ IDEA工程中新建一个全新的包:然后新建一个类:接下来则会编写一个超级简单的程序,程序虽简单,但是通过增加一些JVM的参数可以用简单的程序来阐述JVM垃圾回收的很多知识点,所以意义还是挺大的,具体如下:哇,确实是简单,但是这里有个注意点:就是对于这个by...原创 2019-06-07 21:03:00 · 89 阅读 · 0 评论 -
JVM垃圾回收器理论分析与详解【纯理论】
继续上次【https://www.cnblogs.com/webor2006/p/10740084.html】的理论继续。。有点吐血的感觉,都不知道学了这么一大堆理论有何实际意义,本身JVM就是个理论体系比较多的东东,所以理论不得不去面对,继续硬着头皮往前进。内存结构这个在之前的学习中都已经学习过了,复习一下。内存分配堆上分配大多数情况在eden【年轻代中的一个区域】上分配,偶尔会直...原创 2019-06-05 22:50:00 · 87 阅读 · 0 评论 -
JVM垃圾回收算法分析与演示【纯理论】
继续接着上一次【https://www.cnblogs.com/webor2006/p/10729649.html】的来学习,上次在结尾处提到了JVM常见的GC算法,如下:接下来则逐一的对其进行学习,不过还是纯理论,比较枯燥但是必须得过一遍。标记-清除算法(Mark-Sweep):算法分为“标记”和“清除”两个阶段,首先标记出所有需要回收的对象,然后回收所有需要回收的对象。缺点:a、...原创 2019-04-20 10:13:00 · 90 阅读 · 0 评论 -
JVM垃圾回收重要理论剖析【纯理论】
JVM学习到这里,终于到学习最兴奋的地方了---垃圾回收,在学习它之前还得对JVM垃圾回收相关理论知识进行了解,然后再通过实践来加深对理论的理解,下面直接开始了解相关的理论:JVM运行时内存数据区域:这个在之前其实已经介绍过了,对于JVM的垃圾回收一定是回收内存里面的内容,所以如果不对内存区域的划分,区域存放的内容有所了解,那何谈垃圾回收呢?所以看一下下图对内存区域的划分描述:其这以上区...原创 2019-04-18 15:01:00 · 96 阅读 · 0 评论 -
jstack、jmc、jhat工具使用详解
jstack:在上一次【https://www.cnblogs.com/webor2006/p/10669472.html】jcmd中也可以获取线程的堆栈信息,回顾一下:其实在JDK中还有另一个专门查看或导出Java应用程序中线程的堆栈信息jstack,具体瞅下它的使用:咱们还是以之前死锁的MyTest3为例试一下该工具:xiongweideMacBook-Pro:Coffee...原创 2019-04-12 16:15:00 · 197 阅读 · 0 评论 -
jcmd命令实战
继续来根据之前的那篇infoq的文章的介绍熟悉工具,上一次咱们学习使用了:接下来学习它里面提到的另一个工具:jcmd是一个非常之强大的命令行工具,能输出很多很多的信息,也是在处理JVM的一些问题经常要接触到的一个工具,这个命令也是需要一个进程ID的,而在之前咱们来查询pid时是使用了一个不是特别简明的一个方式,回忆一下:其实jdk提供了一个jps来获取JVM进程的所有pid信息,而...原创 2019-04-08 11:23:00 · 507 阅读 · 0 评论 -
jmap与jstat工具实战分析
在上一节【https://www.cnblogs.com/webor2006/p/10662363.html】最后其实是抛出了infoq关于元空间介绍的文章中所涉及到JDK自带的一些工具的使用,这次咱们来亲自来对文中提到的jmap和jstat工具进行实践,如下:对于JDK自带的工具其实主要是分为两种:一种是命令行工具,另一种是GUI工具,其实GUI工具也就是对命令行工具的一个集成,那既然有...原创 2019-04-07 22:31:00 · 134 阅读 · 0 评论 -
JVM元空间深度解析
回顾一下上一次对于这次做的实验的一个背景说明:这里将借助cglib这个库来完成动态类的创建,为啥要使用它?因为使用简单,二是在程序运行期可以动态的生成类,动态生成类之后生成类的元数据就会落入到元空间当中,这样我们就可以不断来增加类的生成从而来增加元空间元数据的增加,另外在上一次说过元空间默认的大小是21MB:为了能尽快模拟出方法区溢出,我们需要来修改一下JVM的参数来修改元空间的大小并限...原创 2019-04-06 17:43:00 · 107 阅读 · 0 评论 -
线程死锁检测与分析工具深度解析
在上一次【https://www.cnblogs.com/webor2006/p/10652547.html】使用到了jconsole工具来检测线程的执行情况,其中这里面有一个检测死锁的功能,如下:所以这来使用一下该功能,先来编写一个死锁的程序,要想产生死锁肯定至少得要有2个线程,其中一个线程持有一个对象的锁,然后尝试着获取另外一个对象的锁,第二个线程持有另外一个对象的锁,尝试着获取当前对象...原创 2019-04-05 21:11:00 · 109 阅读 · 0 评论 -
线程栈溢出监控与分析详解
在上一次【https://www.cnblogs.com/webor2006/p/10646305.html】编写了堆内存的溢出,也就是上一次JVM内存分布理论的这部分:这次咱们来看另外一个区域:它主要是被线程所使用的,存放着线程上下文的一些数据,这块空间相对堆来说是比较小的,对于栈是有可能出现溢出的,也就是我们熟知的StackOverFlowError,接下来用程序来模拟一下此异常,典...原创 2019-04-04 00:01:00 · 112 阅读 · 0 评论 -
实战jvisualvm
在上一次【https://www.cnblogs.com/webor2006/p/10629889.html】已经编写了一个能在堆空间出现内存溢出的代码,先来回顾一下:其中咱们给JVM配置了如下参数:其中还设置了一个当发生内存溢出时来将内存的信息给dump出来,其实就类似于Android中来分析内存也是需要dump内存信息一样,如下:其dump出来的文件在这个目录之下:其实这个d...原创 2019-04-02 23:56:00 · 121 阅读 · 0 评论 -
Java对象内存分配原理与布局
当一个对象被创建了,那在JVM中是如何的从一个对象不存在到存到,然后将对象存放在什么地方呢?这次主要来探讨一下Java对象创建的过程。new关键字创建对象的3个步骤:1、在堆内存中创建出对象的实例。当我们用new关键字来创建对象的实例时,JVM首先会检查new这个指令的参数是不是能造常量池中定位成一个类的符号引用,然后再检查该符号引用所对应的类是不是被正常的加载、连接、初始了,如果木有则...原创 2019-03-31 00:19:00 · 90 阅读 · 0 评论 -
JVM堆空间用途分析与划分依据
在上一次【https://www.cnblogs.com/webor2006/p/9876493.html】已经对JVM的内存空间的划分进行了理论化的学习,这次还是对上一次提到的理论进行进一步的补充,纯知识巩固,先来回顾一下上节JVM整个内存都由哪些构成:下面则按照上述提到的顺序过一下:虚拟机栈:回顾一下上节做的笔记:知识补充:一个虚拟机栈它本身是归属于一上特定的线程的,换言之它是...原创 2019-03-28 22:48:00 · 77 阅读 · 0 评论 -
JVM内存空间划分与作用详解
在之前已经对Java的字节码进行了非常详细而又系统的学习了,接下来开启jvm内存相关的新篇章,在一个新知识开头之前肯定得理论化的对其进行一个整体的介绍,所以摒弃浮躁,先来看看相关的理论,主要是看一下JVM内存的相关结构:虚拟机栈:每一个方法在执行的过程中都会生成一个栈帧(Stack Frame,在之前【https://www.cnblogs.com/webor2006/p/9718062.ht...原创 2018-10-30 14:02:00 · 77 阅读 · 0 评论 -
动态代理实现机制深层次分析与动态字节码生成总结
在上一次【https://www.cnblogs.com/webor2006/p/9847915.html】已经通过源码的方式将动态代理字节码文件生成出来了,如下:下面来分析一下该字节码的内容,双击打开IDE就可以反编译其字节码的内容,如下:package com.sun.proxy;import com.jvm.bytecode.Subject;import java.lang....原创 2018-10-30 09:50:00 · 78 阅读 · 0 评论 -
透过字节码生成审视Java动态代理运作机制
对于动态代理我想应该大家都不陌生,就是可以动态去代理实现某个接口的类来干一些我们自己想要的功能,但是在字节码层面它的表现是如何的呢?既然目前刚好在研究字节码相关的东东,有必要对其从字节码角度来审视一下。下面先来实现一个动态代码的程序:先新建一个接口:接下来定义一个具体的实现类:然后再建议一个动态代理类,如下:然后在里面要持有要代理的真实对象,如下:然后咱们来调用一下看下效果:...原创 2018-10-25 09:39:00 · 78 阅读 · 0 评论 -
基于栈的指令集与基于寄存器的指令集详细比对及JVM执行栈指令集实例剖析
基于栈的指令集与基于寄存器的指令集详细比对:这次来学习一些新的概念:关于Java字节码的解释执行的一种方式,当然啦是一些纯理论的东东,但很重要,在之后会有详细的实验来对理论进行巩固滴,下面来了解一下:现在JVM在执行Java代码的时候,通常都会将解释执行与编译执行二者结合起来进行。所谓解释执行,就是通过解释器来读取字节码,遇到相应的指令就去执行该指令。所谓编译执行,是通过既时编译器(Just...原创 2018-10-22 22:24:00 · 212 阅读 · 0 评论