
JVM入门到精通
文章平均质量分 89
https://segmentfault.com/blog/limitJIaNotes,入门到精通
zhz小白
只是为了自己学习,不爽的别看,谢谢理解---不要白嫖咯,点点赞啥的
展开
-
JVM(10)——一文串起JVM体系
process on链接:https://www.processon.com/view/link/61912b140e3e744ad4419ff4原创 2022-01-03 23:39:25 · 1033 阅读 · 4 评论 -
JVM(9)——GC
文章目录1、为什么要有GC?2、如何回收垃圾呢?2.1、引用计数法2.1.1、产生的问题:2.2、可达性分析算法(一般用于标记清除和标记整理算法中)3、垃圾收集的算法有什么呢?4、垃圾收集器4.1、串行 GC(Serial GC)/ParNewGC => 标记复制4.2、并行 GC(Parallel GC)=>eden:标记复制 old:标记整理(Java 8默认GC)4.3、CMS GC=>eden:标记复制 old:标记清除4.3.1、六大阶段:4.3.2、应用:4.3.3、原创 2022-01-03 01:22:53 · 1308 阅读 · 5 评论 -
JVM(7)——启动参数
以 - 开头为标准参数,所有的 JVM 都要实现这些参数,并且向后兼容。-D 设置系统属性。以 -X 开头为非标准参数, 基本都是传给 JVM 的,默认 JVM 实现这些参数的功能,但是并不保证所有 JVM 实现都满足,且不保证向后兼容。 可以使用 java -X 命令来查看当前 JVM 支持的非标准参数。以 –XX:开头为非稳定参数, 专门用于控制 JVM的行为,跟具体的 JVM 实现有关,随时可能会在下个版本取消。-XX:±Flags 形式, ± 是对布尔值进行开关。-XX:key=valu.原创 2022-01-03 01:16:01 · 2317 阅读 · 0 评论 -
JVM(8)——工具篇
文章目录1. JDK 内置命令行工具1.1、jps/jinfo1.2、jstat1.3、jmap1.4、jstack == kill -31.5、jcmd*1.6、jrunscript/jjs2、内置图形化工具2.1、jconsole2.2、jvisualvm2.3、jmc1. JDK 内置命令行工具1.1、jps/jinfojps -> 显示进程号jps -mlv -> 把所有的运行的参数运行出来jinfo在mac有bug解决办法:升级成jdk8以上1.2原创 2022-01-03 01:13:19 · 1490 阅读 · 0 评论 -
JVM(4)——class文件结构参照表全集
原创 2022-01-03 01:04:22 · 1094 阅读 · 0 评论 -
JVM(6)——JVM内存模型
文章目录1、JVM内存结构2、JVM内存整体结构3、JVM栈内存结构4、JVM 堆内存结构5、JVM整体结构及内存模型1、JVM内存结构解释:1、每个线程都只能访问自己的线程栈2、每个线程都不能访问其他线程的变量3、所有原生类型的局部变量都存储在线程栈中,因此对其他线程是不可见的。4、线程可以将一个原生变量值得副本传给另一个线程,但不能共享原生局部变量本身5、堆内存中包含了 Java 代码中创建的所有对象,不管是哪个线程创建的。 其中也涵盖了包装类型(例如 Byte,Integer,Lon原创 2022-01-03 00:56:30 · 1027 阅读 · 0 评论 -
JVM(5)——类加载机制
文章目录1、类加载机制1.1、类加载运行全过程1.2、类的加载时机1.3、不会初始化(可能会加载)1.4、类加载器和双亲委派机制1.4.1、类加载器特点1.4.2、类加载器初始化过程1.4.3、全盘加载机制1.4.4、自定义类加载器1.4.5、打破双亲加载机制1.4.6、扩展:tomcat如何打破双亲加载机制1.5、显示当前ClassLoader加载了哪些Jar1.6、添加引用类的几种方式1、类加载机制1.1、类加载运行全过程当我们启动一个Java文件的时候,比如点击main方法时,首先需要通过类原创 2022-01-03 00:54:09 · 1637 阅读 · 0 评论 -
JVM(3)——Class常量池类型分类
原创 2022-01-03 00:46:52 · 1316 阅读 · 0 评论 -
JVM(2)——字节码指令手册
一、未归类系列A此系列暂未归类。指令码助记符说明0x00nop什么都不做0x01aconst_null将null推送至栈顶二、const系列该系列命令主要负责把简单的数值类型送到栈顶。该系列命令不带参数。注意只把简单的数值类型送到栈顶时,才使用如下的命令。比如对应int型才该方式只能把-1,0,1,2,3,4,5(分别采用iconst_m1,iconst_0, iconst_1, iconst_2, iconst_3,iconst_4, iconst_5)送原创 2022-01-03 00:45:21 · 1085 阅读 · 0 评论 -
JVM(1)——字节码
1、JVM基础1.1、JDK,JRE,JVM关系JDKJDK(Java Development Kit) 是用于开发 Java 应用程序的软件开发工具集合,包括 了 Java 运行时的环境(JRE)、解释器(Java)、编译器(javac)、Java 归档 (jar)、文档生成器(Javadoc)等工具。简单的说我们要开发Java程序,就需要安 装某个版本的JDK工具包。JREJRE(Java Runtime Enviroment )提供 Java 应用程序执行时所需的环境,由 Java.原创 2022-01-03 00:43:06 · 1175 阅读 · 0 评论 -
JVM——(24)字节码指令集与解析六(操作数栈管理指令)
文章目录一、操作数栈管理指令的概述不带_x 的dup指令说明带_x 的dup指令说明pop指令与pop2指令说明一、操作数栈管理指令的概述如同操作普通数据结构中的堆栈那样,JVM提供的操作数栈管理指令可以直接用于操作操作数栈常见指令包括如下内容:将一个或两个元素从栈顶弹出,并且直接废弃,采用:pop、pop2指令将复制栈顶的一个或两个数值,并将复制值或双份的复制值重新压入栈顶,采用dup、dup2、dup_x1、dup2_x1、dup_x2、dup2_x2指令将栈最顶端的两个Slot数值位置交原创 2021-05-01 23:39:31 · 1518 阅读 · 0 评论 -
JVM——(23)字节码指令集与解析五(方法调用指令与方法返回指令)
文章目录一、方法调用指令说明invokevirtual指令invokeinterface指令invokespecial指令invokestatic指令invokedynamic指令二、通过示例代码来体会方法调用指令三、通过示例代码来体会方法返回指令示例指令讲解一、方法调用指令说明简要介绍方法调用指令:invokevirtual、invokeinterface、invokespecial、invokestatic、invokedynamic简要方法调用介绍invokevirtual指令用于调用原创 2021-05-04 03:52:19 · 1287 阅读 · 0 评论 -
JVM——(22)字节码指令集与解析四(对象创建与访问指令)
文章目录一、对象创建与访问指令的概述二、创建指令创建类实例的指令:创建数组的指令:三、字段访问指令四、数组操作指令把一个数组元素加载到操作数栈的指令:将一个操作数栈的值存储到数组元素中的指令:取数组长度的指令:arraylength五、类型查找指令一、对象创建与访问指令的概述Java是面向对象的程序设计语言,虚拟机平台从字节码层面就对面向对象做了深层次的支持。有一系列指令专门用于对象操作,可进一步细分为创建指令、字段访问批令、数组操作指令、类型检查指令二、创建指令虽然类实例和数组都是对象,但av原创 2021-05-04 03:52:31 · 1332 阅读 · 0 评论 -
JVM——(21)字节码指令集与解析三(类型转换指令)
文章目录前言一、类型转换指令的概述二、类型转换指令的宽化类型转换**精度损失问题****补充说明**三、类型转换指令的窄型转换**转换规则****精度损失问题****补充说明**前言本篇文章继续学习字节码指令集中的类型转换指令,看看具体指令是怎么操作数据类型转换?一、类型转换指令的概述类型转换指令可以将两种不同的数值类型进行相互转换这些转换操作一般用于实现用户代码中的显式类型转换操作,或者用来处理字节码指令集中数据类型相关指令无法与数据类型一一对应的问题。主要有以下两种类型转换:宽化类型转换与原创 2021-05-04 03:53:25 · 1375 阅读 · 0 评论 -
JVM——(20)字节码指令集与解析二(算数指令)
前言前篇文章讲解了局部变量压栈指令、常量入栈指令以及出栈装入局部变量表指令,那么本篇文章接着讲解算数指令,让我们开始吧一、算数指令概述作用================================算术指令用于对两个操作数栈上的值进行某种特定运算,并把结果重新压入操作数栈分类================================大体上算术指令可以分为两种:对整型数据进行运算的指令与对浮点类型数据进行运算的指令。byte、short、char和booleanl类型说明===原创 2021-05-04 03:53:35 · 1448 阅读 · 0 评论 -
JVM——(19)字节码指令集与解析一(局部变量压栈、常量变量压栈、出栈局部变量表指令)
文章目录前言一、指令概述执行模型字节码与数据类型指令的分类二、加载与存储指令概述作用常见指令三、加载与存储指令的再谈操作数栈与局部变量表操作数栈(Operand Stacks)局部变量表(Local Variables)四、加载与存储指令的局部变量入栈指令五、、加载与存储指令的常量入栈指令const系列push系列指令ldc系列六、加载与存储指令的出栈指令前言前面我们讲解了Class文件的结构、以及采用不同的方式来解读Class文件第一种是采用字节码一行一行的解读、第二种是采用javap的指令进行原创 2021-05-04 03:53:54 · 1615 阅读 · 0 评论 -
JVM——(18)Class文件结构三(JAVAP指令)
文章目录**解析CLass文件****解析字节码的作用****javac - g操作****javap的用法**javap -versionjavap -public JavaTest.classjavap -protected JavapTest.classjavap -p JavapTest.classjavap -package JavapTest.classjavap -sysinfo JavapTest.classjavap -constants JavapTest.classjavap -s J原创 2021-05-04 03:54:04 · 1279 阅读 · 0 评论 -
JVM——(17)Class文件结构二(解读字节码)
文章目录解读字节码之旅**魔数:Class文件的标志、Magic Number(魔数)****Class文件版本号**版本号和ava编译器的对应关系如下表:**常量池:存放所有常量**常量池计数器(constant_poo1_count)constant_pool [](常量池)常量池总结:常量池中为什么要包含这些内容?**访问标识****类索引、父类索引、接口索引集合**this_class(类索引)super_class(父类索引)interfacesinterfaces_count(接口计数器)int原创 2021-05-04 03:54:17 · 1465 阅读 · 0 评论 -
JVM——(16)Class文件结构一(描述介绍)
文章目录**前言**一、Class文件的概述**字节码文件的跨平台性****Java 语言:跨平台性(write one run anywhere)****java 虚拟机:跨语言的平台****JAVA语言和JVM的规范****Java的前端编译器****JAVA源代码遵循JVM规范可正常运行在JVM中****前端编译器VS后端编译器****透过字节码指令看代码细节**二、虚拟机的基石:CLass文件**字节码文件里是什么?****什么是字节码指令(byte code)?****如何解读供虚拟机解释执行的二原创 2021-04-28 00:25:19 · 1569 阅读 · 6 评论 -
JVM——(15)垃圾回收器详细篇
文章目录前言一、GC的分类和性能指标垃圾回收器概述Java不同版本新特性垃圾回收器分类**评估 GC 的性能指标**吞吐量:垃圾收集开销:暂停时间:收集频率:内存占用:快速:**评估 GC 的性能指标:吞吐量****评估 GC 的性能指标:暂停时间****评估 GC 的性能指标:吞吐量 VS 暂停时间**二、不同的垃圾回收器的概述**7款经典回收器与垃圾分代之间的关系****垃圾收集器的组合关系**JDK8前(不包含JDK8)在JDK 8 的时候在JDK 14 的时候**查看默认的垃圾回收器**三、Seri原创 2021-05-05 00:05:03 · 1819 阅读 · 0 评论 -
JVM——(14)垃圾回收相关概念的概述
文章目录前言一、System.Gc的理解二、内存溢出与内存泄露**内存溢出(OOM)的介绍****内存溢出(OOM)原因分析**Java虚拟机的堆内存设置不够:代码中创建了大量大对象,并且长时间不能被垃圾收集器收集(存在被引用):这里面隐含着一层意思是`在抛出OutofMemoryError之前`,通常垃圾收集器会被触发尽其所能去清理出空间当然也不是在任何情况下垃圾收集器都会被触发的**内存泄漏(Memory Leak)的介绍****内存泄露的官方例子**单例模式一些提供close()的资源未关闭导致内存泄原创 2021-05-04 03:54:31 · 1465 阅读 · 0 评论 -
JVM——(13)垃圾回收相关算法
文章目录前言一、标记阶段:引用计数算法**判断对象是否存活?****引用计数算法**优点:缺点:**循环引用情况介绍****引用计数算法 小结**Python如何解决循环引用?二、标记阶段:可达性分析算法**可达性分析实现思路****GC Roots可以是哪些元素?**三、对象的finalization机制**具体过程**四、MAT与JProfilet的GC Roots溯源五、清楚阶段:标记清楚算法**标记-清除算法(Mark-Sweep)介绍**背景:执行过程:何为清楚?标记-清除算法的缺点:**清除阶段原创 2021-05-05 00:06:10 · 1384 阅读 · 0 评论 -
JVM——(12)垃圾回收概述
文章目录前言一、回顾JVM的几个部分二、什么是垃圾?**十几年前的磁盘碎片整理**三、为什么需要GC?四、早期的垃圾回收五、Java的回收机制自动内存管理的优点:关于自动内存管理的担忧:**应该关心哪些区域的回收呢?**六、大厂面试题**蚂蚁金服****百度****天猫****滴滴****京东****阿里****字节跳动**参考资料前言从本篇开始,我们正式开始接触JVM的垃圾回收相关知识,本篇文章先进行概述与介绍一、回顾JVM的几个部分我们希望通过学习JVM达到的目的是让系统在业务越来越复杂的情况原创 2021-05-05 00:09:57 · 1350 阅读 · 0 评论 -
JVM——(11)String Table(字符串常量池)
文章目录前言一、String的基本特性**为什么 JDK9 改变了 String 的结构****一道笔试题****字符串常量池怎么保证不会存储相同内容的?**JDK 6环境下的大小设置:JDK 7环境下的大小设置:二、String的内存分配JDK 6环境运行下在永久代中:JDK 8环境运行下在堆中:**那么为什么要调整字符串常量池的位置?**三、String的基本操作四、字符串拼接操作五、intern()的使用**关于 new String() 的说明****小结intern()**JDK 1.6中,将这个原创 2021-05-05 00:10:36 · 1497 阅读 · 1 评论 -
JVM——(10)执行引擎
文章目录前言一、执行引擎概述**执行引擎的工作过程**二、Java代码编译和执行过程三、机器码、指令、汇编语言**机器码是什么?****指令是什么?****汇编语言是什么?****高级语言是什么?****C、C++源程序执行过程****字节码是什么?**四、解释器**解释器分类****解释器的现状**五、JIT编译器**为啥还需要解释器呢?****HotSpot JVM的执行方式****阿里团队案例****JIT编译器相关概念**典型的编译器:**热点代码及探测方式**方法调用计数器回边计数器六、HotSp原创 2021-05-05 00:10:52 · 1515 阅读 · 0 评论 -
JVM——(9)对象的实例化与访问定位
文章目录前言美团:蚂蚁金服:一、对象的实例化第一步:判断对象对应的类是否加载、链接、初始化:第二步:为对象分配内存:第三步:处理并发安全问题:第四步:属性的默认初始化(零值初始化):第五步:设置对象的对象头:第六步:执行init方法进行初始化:二、对象的内存布局对象头信息说明讲解:实例数据信息说明讲解:对齐填充信息说明讲解:三、对象的访问定位句柄访问:直接指针:参考资料前言本篇补充的对象的实例化的创建方式、创建步骤等等详细说明暂且可以看看一些大厂面试前的引入面试题美团:对象在JVM中是怎么存储原创 2021-05-05 00:11:02 · 1397 阅读 · 0 评论 -
JVM——(8)运行时数据区的方法区
文章目录前言一、栈、堆、方法区的交互关系二、方法区的理解方法区在哪里?方法区基本理解Hotstop中方法区的演进三、设置方法区大小与OOMJDK7及以前(永久代)设置JDK8及以后(元空间)设置四、方法区的内部结构类型信息:域(属性)信息:方法信息:non-final 类型的类变量全局常量:static final运行时常量池:常量池中有啥?那么运行时常量池是啥?五、方法区的使用案例六、方法区演进细节JDk 6 示意图如下:JDk 7 示意图如下:JDk 8 示意图如下:永久代为什么要被元空间替代?字符串常原创 2021-05-05 00:11:12 · 1608 阅读 · 0 评论 -
JVM——(7)运行时数据区的堆空间
文章目录前言一、堆的核心描述堆与进程堆的内存细分JVisualVM可视化查看堆内存二、设置堆内存大小与OOMOOM举例三、年轻代与老年代年轻代配置新生代与老年代在堆结构的占比四、图解对象分配过程对象分配具体过程(一般情况)图解对象分配(一般情况)对象分配特殊情况常用调优工具五、Minor GC、MarjorGc、FullGc部分收集:不是完整收集整个Java堆的垃圾收集整堆收集(Full GC):收集整个java堆和方法区的垃圾收集。年轻代 GC(Minor GC)触发机制老年代GC(MajorGC)触发机原创 2021-05-05 00:11:41 · 1365 阅读 · 0 评论 -
JVM——(6)运行时数据区的本地方法栈
文章目录前言一、本地方法什么是本地方法?为什么要使用Native Method ?与Java环境外交互:与操作系统交互:Sun' S Java现状二、本地方法栈参考资料前言上篇文章介绍了运行时数据区的PC寄存器、虚拟机栈,这篇讲的本地方法栈一、本地方法在讲解运行时数据区里的本地方法栈时,先穿插一个内容讲解本地方法库(红色框框)什么是本地方法?================================简单地讲:一个Native Method就 是一个Java调用非Java代码的接口。原创 2021-05-05 00:12:56 · 1297 阅读 · 0 评论 -
JVM——(5)运行时数据区的虚拟机栈
文章目录前言一、虚拟机栈的概述虚拟机栈出现的背景内存中的栈与堆虚拟机栈基本内容虚拟机栈的特点面试题:开发中遇见的异常有哪些?二、虚拟机栈的存储单位栈中存储什么呢?栈运行原理栈桢的内部结构三、栈桢的局部变量表局部变量表介绍局部变量表存储单位关于Slot的重复利用静态变量与局部变量的对比补充说明四、栈桢的操作数栈操作数栈的代码追踪四、栈顶缓存技术五、栈桢的动态链接六、方法的调用静态链接:动态链接:早期绑定:晚期绑定:虚方法与非虚方法的区别虚拟机中调用方法的指令普通指令:动态调用指令:invokedynamic原创 2021-05-04 03:54:49 · 1323 阅读 · 0 评论 -
JVM——(4)运行时数据区的概述与程序计数器(PC寄存器)
文章目录前言一、运行时数据区概述关于线程的内存关于Runtime类二、从虚拟机看线程JVM系统线程三、运行时数据区之程序计数器(PC寄存器)PC寄存器作用PC寄存器介绍举例体会PC寄存器常见面试题CPU 时间片并发和并行的区别参考资料前言本篇开始学习运行时数据区,上篇文章对类加载子系统做了讲解,后续重点展开观看字节码指令去了解现在我们知道类加载器里面有什么,做了什么事情就可以其实当我们类加载器把类存放到内存当中方法区实际上已经开始使用运行时数据区了,接下来就需要对讲讲运行时数据区进行讲解了一、转载 2021-05-06 01:55:54 · 1468 阅读 · 0 评论 -
JVM——(3)类加载子系统
前言从本篇文章开始进入JVM的学习,前面我们介绍了JAVA、JVM等等这篇文章我们从类加载子系统开始进入学习一、内存结构概述请先看以下的简图,class Files我们称为字节码,从字节码开始后续操作都需要JVM负责第一步:我们要将Class文件加载到内存当中,而类加载需要用到类加载子系统Class Loader来进行加载同时对应到我们的内存当中,生成一个大的Class对象并且将必要的静态属性进行初始化等等(方法区提现)第二步:当我们真正去执行字节码指令的时候,就需要执行引擎去发挥作用,原创 2021-04-29 23:15:36 · 1612 阅读 · 1 评论 -
JVM——(2)聊聊JVM虚拟机
一、介绍JVM跨语言的平台随着Java7的正式发布,Java虚拟机的设计者们通过JSR-292规范基本实现在Java虚拟机平台上运行非Java语言编写的程序ava虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,它只关心“字节码”文件。也就是说Java虚拟机拥有语言无关性,并不会单纯地与Java语言“终身绑定”,只要其他编程语言的编译结果满足并包含Java虚拟机的内部指令集、符号表以及其他的辅助信息,它就是一个有效的字节码文件,就能够被虚拟机所识别并装载运行结论:Java不是最强大原创 2021-04-18 21:30:34 · 1362 阅读 · 0 评论 -
JVM——(1)为什么学习虚拟机
文章目录1、为什么要学习JVM虚拟机?前言一、开发人员如何看待上层框架二、架构师每天都在思考什么?知乎上有条帖子:应该如何看招聘信息,直通年薪50万+?三、JVM与你有啥相关?面试的需要(BATJ、TMD,PKQ等面试都爱问)中高级程序员必备技能(项目管理、调优的需要)追求极客的精神(垃圾回收算法、JIT、底层原理)四、什么人需要学JVM?五、Java 对比 C++参考资料1、为什么要学习JVM虚拟机?前言作为Java工程师的你曾被JVM伤害过吗?你是否也遇到过这些问题?运行着的线上系统突然卡原创 2021-04-18 21:18:29 · 3620 阅读 · 7 评论