自学系列-深入理解Java虚拟机
文章平均质量分 89
自学深入理解Java虚拟机时,每读一段,我会以自己的理解写下解释。便于加深理解和查找错误。
狂野程序员
做一个狂野程序员狂野的成长!
展开
-
震惊!神秘 Bug 竟导致 8 核服务器 load 破百!
震惊!神秘 Bug 竟导致 8 核服务器 load 破百!好吧我承认我也加入了 “UC 震惊部”,那么大家请跟随我的文章,一步步走进当天的场景。场景复现阳光明媚的一个上午,身为“Bug 小王子”的我正在开开心心的敲着自己的新需求代码。此时,业务反馈群中突然反馈:页面响应变慢!业务报错!整个平台陷入僵死状态!我的心里顿时一惊,开始想早上吃了什么 开始想昨晚有没有更新,最近有没有上什么可能会导致平台卡死的需求。同时我的手上动作并没有停,快速的打开 4 台业务机器并输入了 top 指令。此时发现了一台服务器原创 2020-10-21 23:10:49 · 384 阅读 · 0 评论 -
深入理解Java虚拟机-第十三章 Java 内存模型与线程
第十三章 Java 内存模型与线程13.1 概述略13.2 线程安全“线程安全”一个比较恰当的定义:“当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那就称这个对象是线程安全的。”这个定义就很严谨而且有可操作性,它要求线程安全的代码都必须具备一个共同特征:...原创 2020-03-05 22:08:54 · 213 阅读 · 0 评论 -
深入理解Java虚拟机-第十二章 Java 内存模型与线程
第十二章 Java 内存模型与线程12.1 概述衡量一个服务性能的高低好坏,每秒事务处理数(Transaction Per Second,TPS)是最重要的指标之一,它代表着一秒内服务端平均能相应的请求总数,而 TPS 值与程序的并发能力又有非常密切的关系。对于计算量相同的任务,程序线程并发协调的越有条不紊,效率自然越高;反之,线程之间频繁阻塞甚至死锁,将会大大降低程序的并发能力。12.2 ...原创 2020-03-04 21:01:43 · 226 阅读 · 0 评论 -
深入理解Java虚拟机-第十一章 晚期(运行期)优化
第十一章 晚期(运行期)优化11.1 概述本章讲述 JIT(Just In Time Compiler,即时编译器)。Java 虚拟机规范没有具体的约束规则区限制即时编译器应该如何实现,但是 JIT 编译性能的好坏、代码优化程度的高低却是衡量一款商用虚拟机优秀与否的最关键的指标之一,他也是虚拟机中最核心且最能体现虚拟机技术水平的部分。如无特殊说明,本章提及的编译器、即时编译器都是指的 Hot...原创 2020-03-03 17:06:27 · 1741 阅读 · 1 评论 -
深入理解Java虚拟机-第十章 早期(编译期)优化
第十章 早期(编译器)优化10.1 概述Java 语言的编译期实际上是一段不确定的操作过程,他可能是指 java 文件编译到 class 文件的过程,也可能是 JIT 把字节码转为机器码的过程,还有可能是使用静态提前编译器(AOT,Ahead Of Time Compiler)直接把 java 文件编译成本地机器码的过程。下面列举了三类编译过程中一些比较有代表性的编辑器:前端编译器:Sun...原创 2020-02-27 23:45:24 · 557 阅读 · 3 评论 -
深入理解Java虚拟机-第九章 类加载及执行子系统的案例与实践
第九章 类加载及执行子系统的案例与实践9.1 概述略9.2 案例分析9.2.1 Tomcat:正统的类加载器架构在本栏文章《深入理解Java虚拟机-第七章 虚拟机类加载机制》最后曾简单介绍过 Tomcat 是如何破坏双亲委派模型的,此处详细说明下,还是从主流 Java Web 服务器需要解决的问题开始讲起:部署在同一个服务器上的两个 Web 应用程序所使用的 Java 类库可以实现...原创 2020-02-18 19:08:26 · 512 阅读 · 2 评论 -
深入理解Java虚拟机-第八章 虚拟机字节码执行引擎
第八章 虚拟机字节码执行引擎8.1 概述执行引擎是 Java 虚拟机核心组件之一。虚拟机 是一个相对于 物理机 的概念,这两种机器都能执行代码,区别在于物理机是基于 CPU、寄存器、指令集和操作系统层面上的,而虚拟机的执行引擎是由自己实现的,因此可以自行制定指令集和执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集合。8.2 运行时栈帧结构运行时栈帧结构,实际上指的是虚拟机运行时...原创 2020-02-15 21:10:25 · 288 阅读 · 0 评论 -
深入理解Java虚拟机-第七章 虚拟机类加载机制
第七章 虚拟机类加载机制7.1 概述在 Java 语言里面,类型的加载、链接和初始化过程都是在程序运行期间完成的,这种策略虽然会使类加载增加一些性能开销,但是会提供高度的灵活性。例如编写一个接口,可以等到运行的时候再指定其实际的实现类。用户可以通过 Java 预定义的和自定义类加载器,让一个本地的应用程序可以再运行时从网络或其他地方加载一个二进制流作为程序代码的一部分。7.2 类加载的时机...原创 2020-02-13 20:54:15 · 359 阅读 · 1 评论 -
深入理解Java虚拟机-附件3 虚拟机字节码指令表
附件3 虚拟机字节码指令表原创 2020-02-10 14:23:38 · 239 阅读 · 0 评论 -
深入理解Java虚拟机-附件2 虚拟机规范预定义的属性
附件2 虚拟机规范预定义的属性JDK 8 中又新增了三个属性,分别是 RuntimeVisibleTypeAnnotations、RuntimeInvisibleTypeAnnotations、MethodParameters。具体请查阅 《Java 虚拟机规范 (Java SE 8)》,或 Java 虚拟机规范原文。...原创 2020-02-08 16:01:18 · 408 阅读 · 0 评论 -
深入理解Java虚拟机-第六章 类文件结构
第六章 类文件结构6.1 概述略6.2 无关性的基石因为想要实现 “Write Once,Run Anywhere”的伟大理想,Java 虚拟机被发明了出来。这些虚拟机都可以载入和执行同一种平台无关的程序存储格式——字节码(ByteCode),这就是构成无关性的基石。有的文章中只说明了平台无关性,我认为这也同样是语言无关性的基石。平台无关性已是大家所熟知的,它指的是不论是在 Window...原创 2020-02-07 00:30:10 · 562 阅读 · 0 评论 -
深入理解Java虚拟机-附件1 常量池中的 14 种常量项的结构总表
原创 2020-02-06 21:41:37 · 595 阅读 · 0 评论 -
深入理解Java虚拟机-第五章 调优案例分析与实战
第五章 调优案例分析与实战本来是不想写这一章的,因为讲的都是案例分析。而 Eclipse 调优对我本身用的是 IDEA 也仅仅是只有参考作用,所以感觉没有写的必要。可是读着读着感觉还是要开一章写一下自己的思考过程,有助于后面的进步。5.1 概述:略5.2 案例分析5.2.1 高性能硬件上的程序部署策略书中讲述了一个 15 万 PV / 天 左右的在线文档类型网站更换了硬件系统,新的硬件...原创 2020-02-05 17:26:07 · 393 阅读 · 0 评论 -
深入理解Java虚拟机-第四章 虚拟机性能监控与故障处理工具
第四章 虚拟机性能监控与故障处理工具4.1 概述经常使用适当的虚拟机监控和分析工具可以加快我们分析数据、定位解决问题的速度。这里所说的数据包括:运行日志、异常堆栈、GC 日志、线程快照(threaddump / javacore 文件)、堆转储快照(headdump / hprof 文件)等4.2 JDK 的命令行工具Sun 公司(现在应该是 Oracle 了)其实为Java开发者提供了许...原创 2020-02-04 20:46:26 · 209 阅读 · 0 评论 -
深入理解Java虚拟机-第三章 垃圾收集器与内存分配策略(下)
第三章 垃圾收集器与内存分配策略(下)3.5.4 CMS(Concurrent Mark Sweep) 收集器CMS 是一种以尽可能缩短 STW 为目标的收集器,目前很大一部分 B/S 系统的服务端上都应用着 CMS。这类应用重视用户体验,对卡顿尤为敏感。CMS 主要分为四大步骤:初始标记(CMS initial mark) :标记GCRoots能直接关联到的对象以及由新生代中存活对象所...原创 2020-02-04 01:03:58 · 280 阅读 · 0 评论 -
深入理解Java虚拟机-第三章 垃圾收集器与内存分配策略(上)
第三章 垃圾收集器与内存分配策略(上)3.1 概述垃圾处理器实际上仅关注三个点:哪些内存需要回收、什么时候回收以及如何回收。三点会在后面一一讲解前面第二章大致讲述了 JVM 运行时区域的各个部分,我们会发现程序计数器、虚拟机栈、本地方法栈这三个区域基本上是随着线程生而生,死而死。虚拟机栈中的栈帧在类结构确定下来的时候基本就可以知道分配多大的大小。所以这几个区域的内存分配和回收基本是确定的。我...原创 2020-02-02 22:10:59 · 293 阅读 · 1 评论 -
深入理解Java虚拟机-第二章 Java内存区域与内存溢出异常
第二章 Java内存区域与内存溢出异常2.1 概述略2.2 运行时数据区域2.2.1 程序计数器程序计数器在Java内存模型中是一个较小的内存空间,作用是记录程序所执行的字节码的行数,就是说告诉CPU下一个语句该执行什么了。而字节码解释器工作时就是通过更改这个值来选取下一条应该之行的指令。因为Java可以多线程编程,而所谓的多线程实际上是CPU快速切换多个线程实现的,即每个线程都被分配...原创 2020-02-01 18:21:47 · 232 阅读 · 0 评论