
深入了解 JVM
文章平均质量分 82
个人学习 JVM 笔记
喝咖啡的睡眠族
此人很懒zZzZ什么都不会写
展开
-
JVM 原理学习笔记 -- 目录
JVM 学习个人笔记原创 2023-06-24 14:00:27 · 183 阅读 · 0 评论 -
一、JVM 与 Java 体系结构
JVM 是运行在操作系统之上的,它与硬件没有直接的交互。原创 2023-06-24 13:59:50 · 69 阅读 · 0 评论 -
一、类的加载过程
类加载子系统(ClassLoader)负责从文件系统或网络中加载,至于 class 文件的运行,则由执行;加载的类信息存放于内存中的。类加载子系统在加载时分为三个阶段: 加载阶段、链接阶段、初始化阶段。原创 2023-06-24 14:17:21 · 761 阅读 · 0 评论 -
二、类加载器
JVM支持两种类型的类加载器:引导类加载器(Bootstrap ClassLoader) 、自定义类加载器(User-Defined ClassLoader)。从概念上来讲,自定义类加载器一般是指由开发人员在程序中自定义的加载器,但在Java虚拟机规范中的定义是:将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器。在程序中我们常见的类加载器始终只有3种: 、、;这3种类加载器之间没有任何的继承、上下层关系,是包含关系。1、启动类加载器(Bootstrap ClassLoader):原创 2023-06-24 14:21:41 · 190 阅读 · 0 评论 -
三、双亲委派机制
自定义 String 类,但是在加载自定义 String 类的时候会率先使用引导类加载器加载,而引导类加载器在加载的过程中会先加载jdk自带的文件(rt.jar包中java\lang\String.class),报错信息说没有 main 方法,就是因为加载的是 rt.jar 包中的 String 类。而且加载某个类的 class 文件时,Java 虚拟机采用的是双亲委派模式,即把加载请求交由父类加载器来处理,当父类不能加载时,才由子类自己加载。Java 虚拟机对 class 文件采用的是。原创 2023-06-24 14:21:46 · 76 阅读 · 0 评论 -
四、类的主动使用和被动使用
类的主动使用与被动使用的区别在于:当类是主动使用时,在类加载的时候会导致类的初始化() 执行,被动使用虽然也会加载类,但不会触发类的初始化;除了以上7种情况之外,其他使用Java类的方式都被看做是对类的被动使用,都不会导致类的初始化。(会被加载到内存中)原创 2023-06-24 14:26:26 · 160 阅读 · 0 评论 -
三、运行时数据区
Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,有些随着虚拟机启动而创建,随着虚拟机退出而销毁;另一些则是与线程一一对应的,这些与线程对应的数据区会随着线程的开始而创建,随着线程的结束而销毁;原创 2023-06-24 14:28:10 · 72 阅读 · 0 评论 -
一、程序计数器
CPU 在执行并发任务时,是不停的切换线程来实现的,并且在任何一个时刻都只会执行某一个线程的方法,为了能够准确的记录各个线程正在执行的当前字节码指令,最好的办法就是为每个线程单独分配一个 PC 寄存器来记录地址指令。这样一来就能保证各个线程之间不会出现互相干扰的情况。CPU 在执行并发任务时,是不停的切换线程来实现的,当线程切换回来之后,就可以通过寄存器记录的地址指令知道切换线程之前代码执行到哪里了,从而接着上次执行的地方继续执行指令。原创 2023-06-24 14:30:10 · 151 阅读 · 0 评论 -
二、虚拟机栈
不一定:只有当变量的作用域完全在方法内部时,该变量才是线程安全的,其他情况下都是非线程安全的。原创 2023-06-24 14:37:15 · 82 阅读 · 0 评论 -
三、本地方法接口、栈
💡。原创 2023-06-24 14:41:05 · 124 阅读 · 0 评论 -
四、JVM 堆
从内存模型而不是垃圾收集的角度来看,对 Eden 区域继续进行划分,JVM 为每个线程分配了一个私有缓存区域,它包含在 Eden 空间内。多线程在同时分配内存时,使用 TLAB 可以避免一系列的非线程安全问题,同时还能提升内存分配的吞吐量,因此我们可以将这种内存分配方式称之为快速分配策略。尽管不是所有的对象实例都能够在 TlAB 中成功分配内存,但 JVM 确实是将 TLAB 作为内存分配的首选。在程序中,可以通过选项。原创 2023-06-24 14:48:21 · 94 阅读 · 0 评论 -
五、方法区
域的相关信息包括:域名称、域类型、域修饰符(public、private、protected、static、final、volatile、transient 的某个子集)。④、方法的修饰符(public、private、protected、static、final、synchronized、native、abstract 的一个子集);表中记录了:异常处理的开始位置、结束位置、代码处理在程序计数器中的偏移地址、被捕获的异常类的常量池索引。JVM 必须在方法区中保存类型的所有域的相关信息以及域的声明顺序。原创 2023-06-24 14:51:17 · 78 阅读 · 0 评论 -
四、对象的实例化内存布局与访问定位
在堆中开辟了一个特有空间,专门存储实例对象的句柄,这个句柄含有两个值 实例对象的地址(指向堆空间中的实例对象)、实例对象元数据地址(指向方法区中的类对象)。💡 将对象的所属类(即类的元数据信息地址)、对象的 HashCode 和对象的 GC 信息、锁信息等数据存储在对象的对象头中,这个过程的具体设置方式取决与 JVM 的实现。内存不规整时,虚拟机会维护一个内存空闲列表,列表里记录了哪些内存是可用的,在分配的时候从列表内找一块足够大的空间划分给对象,并更新列表上的内存。原创 2023-06-24 15:07:14 · 88 阅读 · 0 评论 -
五、执行引擎
解释器:当 Java 虚拟机启动时,会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内存”翻译“为对应平台的本地机器执行指令;JIT 编译器:虚拟机将源码直接编译成和本地机器平台相关的机器语言。原创 2023-06-24 15:10:35 · 435 阅读 · 0 评论 -
六、String Table
不可变性⚠️是一个固定大小的 Hashtable,默认值大小长度是 60013。如果放进 String Pool 的字符串非常多,就会造成严重的 Hash 冲突,从而导致链表会很长,而链表长了后的直接影响是当调用 String.intern() 时性能大幅度下降。可以使用来设置 StringTable 的长度。(在 jdk6 中 StringTable 的长度就是 1009;到 jdk7 及之后,默认长度变为 60013(jdk8 开始,StringTableSize的可设置最小值是 1009))原创 2023-06-24 15:15:37 · 91 阅读 · 0 评论 -
一、垃圾回收概述及相关概念
经典三问:哪些内存需要回收?什么是回收?如何回收?💡 什么是垃圾?垃圾是指在程序运行当中,没有任何指针指向的对象,这个对象就是需要被回收的垃圾💡 为什么要回收?如果不及时对内存中的垃圾进行清理,那么这些垃圾对象所占用的空间会一直保留到应用程序执行结束,被占用的空间无法被其他对象使用,极易导致内存溢出,从而使程序宕机。原创 2023-06-24 15:21:31 · 345 阅读 · 0 评论 -
二、垃圾回收相关算法
在堆里存放着几乎所有的 Java 对象实例,在 GC 执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为已经死亡的对象,GC 才会在执行垃圾回收时,释放其占用的内存空间。因此这个区分过程称之为垃圾标记阶段。那么如何标记一个对象是否已经“死亡”呢?简单来说:当一个对象已经不再被任何的存活对象所引用的时候,这个对象就可以宣告死亡。引用计数法可达性分析。原创 2023-06-24 15:25:41 · 85 阅读 · 0 评论 -
三、垃圾回收器介绍
如果想要最小化的使用内存和并行开销:请选 Serial GC;如果想要最大化应用程序的吞吐量:请选 Parallel GC;如果想要最低延迟:请选 CMS GC;垃圾收集器分类作用位置使用算法特点适用场景起止版本Serial单线程串行运行新生代复制算法响应速度优先适用于单 CPU 环境下的 Client 模式起于 jdk1.3Serial Old单线程串行运行老年代标记 - 压缩算法响应速度优先适用于单 CPU 环境下的 Client 模式起于 jdk1.3。原创 2023-06-24 15:29:27 · 93 阅读 · 0 评论 -
八、Class 文件结构
方法表集合之后的属性表集合,指的是 class 文件所携带的辅助信息,比如该 class 文件的源文件的名称。当虚拟机运行时,需要从常量池中获得对应的符号引用,再在类加载过程中的解析阶段将其替换为直接引用,并翻译到具体的内存地址中。• 字段表集合中不会列出从父类或者实现的接口中继承而来的字段,但有可能列出原本Java代码之中不存在的字段。在 interfaces[ ] 中,各成员所表示的接口顺序和对应的源代码中给定的接口顺序(从左至右)一样,即interfaces[ 0 ] 对应的是源代码中最左边的接口。原创 2023-06-24 15:36:58 · 81 阅读 · 0 评论 -
九、JVM 指令
(操作码)(操作数)原创 2023-06-24 15:42:26 · 425 阅读 · 0 评论 -
十、JVM 监控及诊断工具 - 命令行
JVM 的命令工具都存放在 jdk 的bin 目录下;原创 2023-06-24 15:42:54 · 1292 阅读 · 0 评论 -
十一、JVM 监控工具
Arthas是Alibaba开源的Java诊断工具,在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。Arthas 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。MAT 支持一种类似于 SQL 的查询语句 OQL,可以在堆中进行对象的查找和筛选。💡 自行了解吧,跟 sql 差不多。原创 2023-06-24 15:44:44 · 835 阅读 · 0 评论 -
十二、JVM 运行时参数
java -help。原创 2023-06-24 15:46:40 · 314 阅读 · 0 评论 -
十三、分析 GC 日志
针对HotSpot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆收集(Full GC)💡-XX:+PrintGC:输出 GC 日志(或 -verbose:gc);-XX:+PrintGCDetails:输出 GC 详细日志;-XX:+PrintGCTimeStamps:输出 GC 的时间戳-XX:+PrintGCDateStamps:输出 GC 的时间戳(以日期形式)原创 2023-06-24 15:59:34 · 124 阅读 · 0 评论