![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM 学习笔记
文章平均质量分 82
小宇哥x
这个作者很懒,什么都没留下…
展开
-
JVM 学习笔记一、JVM与Java体系结构
一、JVM与Java体系结构1、汇编语言、机器语言、高级语言关系2、Java 的特性跨平台性:随着Java7的正式发布,Java虚拟机的设计者们通过JSR-292规范基本实现在Java虚拟机平台上运行非Java语言编写的程序。Java虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,它只关心“字节码”文件。每个语言都需要转换成字节码文件,最后转换的字节码文件都能通过Java虚拟机进行运行和处理3、Java 代码执行过程详图JAVA文件–>字节码文件–>JAV.原创 2021-05-13 08:54:33 · 350 阅读 · 1 评论 -
JVM 学习笔记二、类加载子系统
二、类加载子系统1、作用负责从文件系统或者网络中加载Class文件,Class文件开头有特定文件标识Classloader只负责class文件的加载,是否可以运行,由Execution Engine执行引擎决定加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是class文件中常量池部分的内存映射)2、类的加载过程(面试常问)类装载的执行过程:(5步)加载:根据查找路径找到相应的 class .原创 2021-05-13 09:01:23 · 134 阅读 · 1 评论 -
JVM 学习笔记三、运行时数据区
三、运行时数据区(面试常问)说一下JVM运行时数据区?线程私有:虚拟机栈、本地方法栈、程序计数器线程共享:堆,方法区(元空间)(面试常问)百度:说一下JVM内存模型?分哪几个区,每个区的作用是什么?虚拟机栈:存储局部变量表、操作数栈、动态链接、方法返回地址等信息。Java方法调用。本地方法栈:本地方法调用程序计数器:记录下一条字节码执行指令,实现分支循环跳转、异常处理、线程恢复等功能。堆:所有线程共享,几乎所有对象实例都在堆中分配内存方法区:用于存储已被虚拟机加载的类信息、常量.原创 2021-05-13 09:05:46 · 113 阅读 · 0 评论 -
JVM 学习笔记四、程序计数器(PC寄存器)
四、程序计数器(PC寄存器)特点:运行时数据区中唯一不会出现OOM的区域,没有垃圾回收。每个线程有一个私有的程序计数器,线程之间互不影响。程序计数器会存储当前线程正在执行的Java方法的 JVM指令地址,为了线程切换后能恢复到正确的位置。如果正在执行的本地方法,这个计数器值则应为空。(undefined)(面试常问)使用PC寄存器存储字节码指令地址有什么用?(面试常问)为什么使用PC寄存器记录当前线程的执行地址呢?记录下一条字节码执行的指令,实现分支循环跳转、异常处理、线程恢复等功.原创 2021-05-13 09:07:04 · 150 阅读 · 0 评论 -
JVM 学习笔记五、虚拟机栈
五、虚拟机栈1、基本内容栈是运行时的单位,而堆是存储的单位: 栈解决程序如何执行,如何处理数据。堆解决的是数据存储问题,即数据怎么放,放在哪里。Java虚拟机栈,早起也叫Java栈,每个线程创建时都会创建一个虚拟机栈,内部保存一个个栈帧,对应着一次次的Java方法调用。生命周期和线程的一致主管Java程序的运行,保存方法的局部变量(8种基本数据类型,对象的引用地址),部分结果,并参与方法的调用和返回。局部变量 vs 成员变量基本数据类型 VS 引用类型变量(类,数组,接口)2.原创 2021-05-13 09:11:27 · 118 阅读 · 0 评论 -
JVM 学习笔记六、本地方法接口
六、本地方法接口1、什么是本地方法简单地讲,一个Native Method就是一个Java调用非Java代码的接口。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如c。标识符native可以与所有其它的java标识符连用,但是abstract除外。2、为什么使用native methodJava应用需要与Java外面的环境交互,这是本地方法存在的主要原因。例如与操作系统底层或硬件交换信息时的情况例如启动一个线程...原创 2021-05-13 09:12:32 · 53 阅读 · 0 评论 -
JVM 学习笔记七、本地方法栈
七、本地方法栈Java虚拟机栈:Java方法调用;本地方法栈:本地方法调用。本地方法栈,线程私有(key生成hash值为native方法)。允许被实现成固定或者是可动态扩展的内存大小,内存溢出情况和Java虚拟机栈相同。使用C语言实现具体做法是Native Method Stack 中登记native方法,在Execution Engine执行时加载到本地方法库当某个线程调用一个本地方法时,就会进入一个全新,不受虚拟机限制的世界,它和虚拟机拥有同样的权限。并不是所有的JVM都支持本地方法.原创 2021-05-13 09:13:38 · 65 阅读 · 0 评论 -
JVM 学习笔记八、堆
八、堆1、堆空间的概述一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确认了。堆内存的大小是可调节的,参数-Xms,-Xmx。堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享Java堆,但这里还可以划分线程私有的缓冲区(TLAB:thread local allocation buffer)。“几乎“所有的对象实例都在堆分配内存。有些对象可能栈上分配:逃逸分析,标量替换,但是数组和对象可能永.原创 2021-05-13 09:18:01 · 150 阅读 · 0 评论 -
JVM 学习笔记九、方法区
九、方法区1、堆、栈、方法区的交互关系其中:Person 类的 .class 信息存放在方法区中person 变量存放在 Java 栈的局部变量表中真正的 person 对象存放在 Java 堆中在 person 对象中,有个指针指向方法区中的 person 类型数据,表明这个 person 对象是用方法区中的 Person 类 new 出来的2、方法区的理解Java里面的Class在运行时是包含两部分数据的,一部分是类的元数据信息,这部分数据存储在方法区,包括常量池、属性表、方法.原创 2021-05-13 09:20:52 · 131 阅读 · 0 评论 -
JVM 学习笔记十、对象的实例化、内存布局与访问定位
十、对象的实例化、内存布局与访问定位1、对象的实例化创建对象的方式:1、new:最常见的方式变形:xxx的静态方法xxxBuilder/xxxFactory的静态方法2、Class 的 newInstance:JDK9标记过时,反射的方式,只能调用空参的构造器,权限必须是public3、Constructor 的 newInstance:反射的方式,可以调用空参,带参的构造器,权限没有要求。4、使用clone:不调用任何构造器,当前类需要实现Cloneable接口,实现clone方法.原创 2021-05-13 09:33:56 · 133 阅读 · 0 评论 -
JVM 学习笔记十一、执行引擎
十一、执行引擎1、执行引擎概述执行引擎是Java虚拟机核心的组成部分之一,虚拟机的执行引擎由软件自行实现,能够执行不被硬件直接支持的指令格式,物理机的执行引擎是操作系统层面上。执行引擎的工作过程:执行引擎在执行的过程中究竟需要执行什么样的字节码指令完全依赖于PC寄存器。每当执行完一项指令操作后,PC寄存器就会更新下一条需要被执行的指令地址。当然方法在执行的过程中,执行引擎有可能会通过存储在局部变量表中的对象引用准确定位到存储在Java堆区中的对象实例信息,以及通过对象头中的元数据指针定位到.原创 2021-05-14 08:56:00 · 132 阅读 · 0 评论 -
JVM 学习笔记十二、StringTable(字符串常量池)
十二、StringTable1、String 的基本特性(面试常问)StringTable(字符串常量池)为什么要调整?jdk7中将StringTable放到了堆空间中,因为永久代的回收效率很低。在fullGC的时候才触发,而fullGC是老年代空间不足或永久代不足时才触发。这就导致了StringTable回收效率不高,而我们开发中会创建大量的字符串,回收效率低,导致永久代内存不足。放到堆里,能及时回收内存。String的基本特性:字符串,用""引起来表示声明为final的不可被继承的.原创 2021-05-14 09:04:20 · 311 阅读 · 0 评论 -
JVM 学习笔记十三、垃圾回收概述
十三、垃圾回收概述1、什么是垃圾?垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。2、为什么需要进行垃圾回收?不进行垃圾回收,内存会很快消耗完。进行垃圾回收,释放内存空间。碎片整理,令新对象获得连续的内存空间。STW的GC无法满足实际需求,需要对GC进行优化。优点:无需手动分配回收内存,降低内存泄漏、内存溢出的.原创 2021-05-14 09:06:09 · 112 阅读 · 1 评论 -
JVM 学习笔记十四、垃圾回收相关算法
十四、垃圾回收相关算法1、标记阶段—引用计数算法标记阶段:判断对象是否存活堆存放:几乎所有的Java对象实例,GC之前:区分对象是否存活。GC执行只回收死亡对象,释放其所占用的内存空间。标记死亡对象:当一个对象不再被存活的对象引用时两种方式:引用计数算法、可达性分析算法引用计数算法:每个对象上保存整形的引用计数属性,有对象引用计数器+1,减少引用计数器-1。计数器为零时,进行垃圾回收。优点:实现简单、垃圾对象易识别、判定效率高、回收没有延迟性缺点:无法解决循环引用问题代码测试证明.原创 2021-05-14 09:11:39 · 130 阅读 · 1 评论 -
JVM 学习笔记十五、垃圾回收相关概念
十六、垃圾回收相关概念1、System.gc() 的理解在默认情况下,通过System.gc()者Runtime.getRuntime().gc() 的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。System.gc()调用无法保证对垃圾收集器的调用(不能确保立即生效),JVM实现者可以通过System.gc() 调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则就太过于麻烦。代码测试对象回收行为:(面试常问)垃.原创 2021-05-14 09:16:13 · 180 阅读 · 2 评论 -
JVM 学习笔记十六、垃圾回收器
十六、垃圾回收器1、GC 分类与性能指标1.1、垃圾回收器分类按线程数分(垃圾回收线程数),可以分为串行垃圾回收器和并行垃圾回收器串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。并行收集可以运用多个CPU同时执行垃圾回收,因此提升了应用的吞吐量,不过并行回收仍然与串行回收一样,采用独占式,使用了“Stop-the-World”机制。适用场景:在诸如单CPU处理器或者较小的应用内存等硬件平台不是特别优越的场合,串行回收器的性能表.原创 2021-05-14 09:23:51 · 229 阅读 · 0 评论 -
JVM 学习笔记十七、字节码与执行细节
十七、字节码与执行细节1、字节码文件的跨平台性Java语言:跨平台的语言(write once ,run anywhere)当Java源代码成功编译成字节码后,如果想在不同的平台上面运行,则无须再次编译Java虚拟机:跨语言的平台Java虚拟机不和包括 Java 在内的任何语言绑定,它只与“Class 文件”这种特定的二进制文件格式所关联。 无论使用何种语言进行软件开发,只要能将源文件编译为正确的Class文件,那么这种语言就可以在Java虚拟机上执行。想要让一个Java程序正确地运.原创 2021-05-14 09:27:12 · 132 阅读 · 2 评论 -
JVM 学习笔记十八、Class 文件结构
十八、Class 文件结构1、解读字节码指令的方式字节码文件里是什么?源代码经过编译器编译之后便会生成一个字节码文件,字节码是一种二进制的类文件,它的内容是JVM的指令,而不像C、C++经由编译器直接生成机器码(这也是C执行效率高的原因之一)。什么是字节码指令(byte code)?Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的操作码(opcode)以及跟随其后的零至移个代表此操作所需参数的操作数(operand)所构成。虚拟机中许多指令并不包含操作数,只有一个操作码。比如:操.原创 2021-05-14 09:31:26 · 256 阅读 · 0 评论 -
JVM 学习笔记十九、javap命令的使用
十九、javap命令的使用1、javap 的参数通过反编译生成的字节码文件,我们可以深入的了解java代码的工作机制。但是,自己分析类文件结构太麻烦了!除了使用第三方的jclasslib工具之外,oracle官方也提供了工具:javap。javap是jdk自带的反解析工具。它的作用就是根据class字节码文件,反解析出当前类对应的code区 (字节码指令)、局部变量表、异常表和代码行偏移量映射表、常量池等信息。通过局部变量表,我们可以查看局部变量的作用域范围、所在槽位等信息,甚至可以看到槽位复用.原创 2021-05-14 09:32:57 · 374 阅读 · 0 评论 -
JVM 学习笔记二十、字节码指令集与解析举例
二十、字节码指令集与解析举例1、概述Java字节码对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令。Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。由于 Java虚拟机采用面向操作数栈而不是寄存器的结构,所以大多数的指令都不包含操作数,只有一个操作码。由于限制了Java虚拟机操作码的长度为一个字节(即0~255),这意味着指令集的操作码总数不可能超过256条。熟悉.原创 2021-05-14 09:38:24 · 217 阅读 · 0 评论 -
JVM 学习笔记二十一、字节码指令集与解析举例2
二十一、字节码指令集与解析举例27、方法调用与返回指令方法调用指令方法调用指令:invokevirtual、 invokeinterface、invokespecial、 invokestatic 、 invokedynamic以下5条指令用于方法调用:invokevirtual指令:用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派),支持多态。这也是Java语言中最常见的方法分派方式。(多态场景下方法的重写)invokeinterface指令:用于调用接口方法,它会在运.原创 2021-05-15 09:38:25 · 233 阅读 · 0 评论 -
JVM 学习笔记二十二、类的加载过程详解
二十二、类的加载过程详解1、概述在Java中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载。按照 Java虚拟机规范,从class文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段:其中,验证、准备、解析3个部分统称为链接(Linking)从程序中类的使用过程看:2、Loading(加载)阶段1. 加载完成的操作加载的理解所谓加载,简而言之就是将Java类的子节码文件加载到机器内存中,并在内存中构建出Ja.原创 2021-05-15 09:42:26 · 181 阅读 · 2 评论 -
JVM 学习笔记二十三、类的加载器
二十三、类的加载器1、概述类加载器是 JVM执行类加载机制的前提。ClassLoader的作用:ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的java.lang.Class对象实例。然后交给Java虚拟机进行链接、初始化等操作。因此,ClassLoader在整个装载阶段,只能影响到类的加载,而无法通过ClassLoader去改变类的链接和初.翻译 2021-05-15 09:46:57 · 184 阅读 · 0 评论 -
JVM 学习笔记二十四、性能监控与调优概述
二十四、性能监控与调优概述1、背景说明1.1、生产环境中的问题生产环境发生内存溢出该如何处理?生产环境应该给服务器分配多少内存合适?如何对垃圾回收器的性能进行调优?生产环境CPU负载飙高该如何处理?生产环境应该给应用分配多少线程合适?不加log,如何确定请求是否执行了某一行代码?不加log,如何实时查看某个方法的入参与返回值?1.2、为什么要调优?防止出现OOM解决OOM减少Full GC出现的频率1.3、不同阶段的考虑上线前项目运行阶段线上出现OOM2、.原创 2021-05-15 09:48:11 · 100 阅读 · 0 评论 -
JVM 学习笔记二十五、JVM监控及诊断工具-命令行篇
二十五、JVM监控及诊断工具-命令行篇1、概述性能诊断是软件工程师在日常工作中经常面对和解决的问题,在用户体验至上的今天,解决好应用软件的性能问题能带来非常大的收益。Java作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成Java应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络I/O、垃圾收集等。想要定位这些问题,一款优秀的性能诊断工具必不可少。体会1:使用数据说明问题,使用知识分析问题,使用工具处理问题体会2:无监控、不调优!简单的命令行工具.原创 2021-05-15 09:51:41 · 513 阅读 · 1 评论 -
JVM 学习笔记二十六、JVM监控及诊断工具-GUI篇
二十六、JVM监控及诊断工具-GUI篇1、工具概述使用上一张命令行工具或组合能帮您获取目标Java应用性能相关的基础信息,但他们存在下列局限:(1)无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间(这对定位应用性能瓶颈至关重要)。(2)要求用户登录到目标Java应用所在的宿主机上,使用起来不方便。(3)分析数据通过终端输出,结果展示不够直观。为此,JDK提供了一些内存泄露的分析工具,如 jconsole,jvisualvm等,用于辅助开发人员定位问题,但是这些工.原创 2021-05-15 09:54:36 · 354 阅读 · 0 评论 -
JVM 学习笔记二十七、JVM运行时参数
二十七、JVM运行时参数1、JVM参数选项类型1.1、类型一:标准参数选项特点:比较稳定,后续版本基本不会变化,以-开头各种选项:运行java或者java -help可以看到所有的标准选项补充内充:-server与-clientHotspot JVM有两种模式:分别是server和client,分别通过-server和-client模式设置在32位Windows系统上,默认使用Client类型的 JVM。要想使用Server模式,则机器配置至少有2个以上的CPU和2G以上的物理.原创 2021-05-15 09:56:52 · 547 阅读 · 0 评论 -
JVM 学习笔记二十八、分析GC日志
二十八、分析GC日志1、GC日志参数2、GC日志格式针对HotSpot VM的实现,它里面的GC按照回收区域又可分为辆大众类型:一种是部分收集(Partial GC),一种是整堆收集(Full GC)部分收集:不是完整收集整个Java堆的垃圾收集。其中又分为:新生代收集(Minor GC / Young GC):只有新生代(Eden\S0,S1)的垃圾收集老年代收集(Major GC / Old GC):只有老年代的垃圾收集。目前,只有CMS GC会有单独收集老年代的行为。注.转载 2021-05-15 10:00:04 · 121 阅读 · 0 评论