JVM
文章平均质量分 95
XiaoMing_Coder
太原理工大学,云顶书院Java方向
展开
-
ThreadLocal详解
但是,要求每个Thread都会退出,是一个极其苛刻的要求,对于线程池来说,大部分线程会一直存在在系统的整个生命周期内,那样的话,就会造成value对象出现泄漏的可能。这样设计的好处是,如果这个变量不再被其他对象使用时,可以自动回收这个ThreadLocal对象,避免可能的内存泄露(注意,Entry中的value,依然是强引用,如何回收,见下文分解)。虽然ThreadLocalMap中的key是弱引用,当不存在外部强引用的时候,就会自动被回收,但是Entry中的value依然是强引用。原创 2024-10-30 14:16:29 · 844 阅读 · 0 评论 -
强引用、弱引用、软引用、虚引用
Java中4种引用的级别和强度由高到低依次为:强引用 -> 软引用 -> 弱引用 -> 虚引用当垃圾回收器回收时,某些对象会被回收,某些不会被回收。垃圾回收器会从根对象Object来标记存活的对象,然后将某些不可达的对象和一些引用的对象进行回收。引用类型被垃圾回收时间用途生存时间强引用从来不会对象的一般状态JVM停止运行时终止软引用当内存不足时对象缓存内存不足时终止弱引用正常垃圾回收时对象缓存垃圾回收后终止虚引用正常垃圾回收时跟踪对象的垃圾回收垃圾回收后终止。原创 2024-10-25 21:05:45 · 1027 阅读 · 0 评论 -
JIT详解
在Java中,JIT(Just-In-Time)编译器是Java虚拟机(JVM)的一个重要组成部分,它负责将Java字节码转换成特定平台的机器码。Java的JIT编译器的目的是提高程序的执行效率,特别是对于长时间运行的Java应用来说,JIT编译可以显著提高性能。这也解释了我们为什么经常会说。在 JDK 的源码里,也有很多被 @ForceInline注解的方法,这些方法,会在执行的时候被强制进行内联;答案是否定的,通过逃逸分析,JVM 能够分析出一个新的对象的使用范围,从而决定是否要将这个对象分配到堆上。原创 2024-10-16 19:32:00 · 900 阅读 · 0 评论 -
类加载过程
类从被加载到虚拟机内存中开始到卸载出内存为止,它的整个生命周期可以简单概括为 7 个阶段:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)。其中,验证、准备和解析这三个阶段可以统称为连接(Linking)。这 7 个阶段的顺序如下图所示:一个类的完整生命周期Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机是如何加载这些 Class 文件原创 2024-10-16 19:30:50 · 944 阅读 · 0 评论 -
类加载器详解
类加载器从 JDK 1.0 就出现了,最初只是为了满足 Java Applet(已经被淘汰) 的需要。后来,慢慢成为 Java 程序中的一个重要组成部分,赋予了 Java 类可以被动态加载到 JVM 中并执行的能力。根据官方 API 文档的介绍:类加载器是一个负责加载类的对象。是一个抽象类。给定类的二进制名称,类加载器应尝试定位或生成构成类定义的数据。典型的策略是将名称转换为文件名,然后从文件系统中读取该名称的“类文件”。每个 Java 类都有一个引用指向加载它的。不过,数组类不是通过。原创 2024-10-16 19:29:56 · 625 阅读 · 0 评论 -
类文件结构
根据 Java 虚拟机规范,Class 文件通过ClassFile定义,有点类似 C 语言的结构体。//Class 文件的标志//Class 的小版本号//Class 的大版本号//常量池的数量//常量池//Class 的访问标记//当前类//父类//接口数量//一个类可以实现多个接口//字段数量//一个类可以有多个字段//方法数量//一个类可以有个多个方法//此类的属性表中的属性数//属性表集合通过分析ClassFile。原创 2024-10-16 19:28:55 · 939 阅读 · 0 评论 -
JVM垃圾回收机制
无论是通过引用计数法判断对象引用数量,还是通过可达性分析法判断对象的引用链是否可达,判定对象的存活都与“引用”有关。JDK1.2 之前,Java 中引用的定义很传统:如果 reference 类型的数据存储的数值代表的是另一块内存的起始地址,就称这块内存代表一个引用。JDK1.2 以后,Java 对引用的概念进行了扩充,将引用分为强引用、软引用、弱引用、虚引用四种(引用强度逐渐减弱)强引用,弱引用,软引用,虚引用它们有什么区别?你知道吗?_强引用,软引用,弱引用,虚引用-CSDN博客。原创 2024-10-16 19:25:52 · 901 阅读 · 0 评论 -
Java内存结构
如下图所示,不同编程语言(Java、Groovy、Kotlin、JRuby、Clojure …)通过各自的编译器编译成.class文件,并最终通过 JVM 在不同平台(Windows、Mac、Linux)上运行。运行在 Java 虚拟机之上的编程语言也就是说我们平时接触到的 HotSpot VM 仅仅是是 JVM 规范的一种实现而已。除了我们平时最常用的 HotSpot VM 外,还有 J9 VM、Zing VM、JRockit VM 等 JVM。原创 2024-10-16 19:22:57 · 1043 阅读 · 0 评论 -
字符串常量池
这里的value就是底层用来存储字符的char类型数组,到这里我们就可以明白了,其实StringBuilder也对null的字符串进行了特殊处理,在append的过程中如果碰到是null的字符串,那么就会以"null"的形式被添加进字符数组,这也就导致了两个为空null的字符串相加后会打印为"nullnull"。就 HotSpot VM 的实现来说,加载类时字符串字面量会进入到运行时常量池,不会进入全局的字符串常量池,即在 StringTable 中并没有相应的引用,在堆中也没有对应的对象产生。原创 2024-10-11 14:15:12 · 937 阅读 · 0 评论 -
类加载器解析、栈动态链接、符号引用和直接引用
例如,在字节码中,一个类、方法或字段的引用可能被表示为一个符号,例如类名、方法名或字段名。经过解析阶段后,符号引用会被替换为指向具体类、方法或字段的内存地址,JVM能够通过这些地址直接访问或调用。JVM可以在类加载时立即解析所有符号引用,也可以选择在首次使用某个符号引用时(例如,第一次调用某个方法或访问某个字段时)才进行解析。解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用限定符 7 类符号引用进行。在解析过程中,JVM会根据不同的符号引用类型执行不同的解析操作。原创 2024-10-10 19:23:21 · 771 阅读 · 0 评论