随笔分类 -  Java

摘要:为什么 Java 8 移除了永久代(PermGen)并引入了元空间(Metaspace)? 在 Java 8 中,JVM 移除了 永久代(PermGen)并引入了 元空间(Metaspace),这一改变主要是为了解决 PermGen 空间不足 和 内存管理效率低 的问题。以下是具体原因和改动的细节。 阅读全文
posted @ 2024-12-11 12:04 Eiffelzero 阅读(304) 评论(0) 推荐(0)
摘要:为什么 Java 的垃圾收集器将堆分为老年代和新生代? Java 垃圾收集器通过将堆内存划分为 新生代 和 老年代,优化了内存管理,提高了垃圾回收的效率。这种分代思想是基于 对象生命周期的特点。 1. 对象生命周期的特点 短生命周期对象(临时对象): 例如局部变量、方法返回值等,生命周期通常较短。 阅读全文
posted @ 2024-12-11 12:02 Eiffelzero 阅读(286) 评论(0) 推荐(0)
摘要:Java 中如何判断对象是否是垃圾? 在 Java 中,垃圾是指不再被引用的对象。JVM 使用以下两种方法判断对象是否是垃圾: 1. 引用计数法(Reference Counting) 工作原理 每个对象维护一个计数器,记录被引用的次数。 当引用计数为 0 时,说明对象是垃圾,可以被回收。 优点 简 阅读全文
posted @ 2024-12-11 11:56 Eiffelzero 阅读(153) 评论(0) 推荐(0)
摘要:Java 中常见的垃圾收集器 Java 提供了多种垃圾收集器(Garbage Collector, GC),每种收集器针对不同的应用场景和需求进行了优化。以下是常见的垃圾收集器及其特点。 1. Serial 收集器 特点 单线程工作,适合单核 CPU 环境。 使用 标记-复制算法(新生代)和 标记- 阅读全文
posted @ 2024-12-11 11:51 Eiffelzero 阅读(583) 评论(0) 推荐(0)
摘要:Java 中的垃圾回收算法 Java 中的垃圾回收(Garbage Collection,GC)机制通过多种算法实现对堆内存的管理。以下是常见的垃圾回收算法: 1. 标记-清除算法(Mark-Sweep) 工作原理 标记阶段:遍历对象图,标记所有可达对象。 清除阶段:清除未标记的不可达对象,回收内存 阅读全文
posted @ 2024-12-11 11:48 Eiffelzero 阅读(910) 评论(0) 推荐(0)
摘要:Java 中的引用类型:强引用、软引用、弱引用和虚引用 Java 中的引用类型主要分为 强引用、软引用、弱引用 和 虚引用,它们对对象的生命周期和垃圾回收(GC)行为产生不同的影响。 1. 强引用(Strong Reference) 定义 强引用是 Java 中最常见的引用类型。通过赋值操作符 = 阅读全文
posted @ 2024-12-11 00:51 Eiffelzero 阅读(128) 评论(0) 推荐(0)
摘要:Java 的逃逸分析 1. 定义 逃逸分析(Escape Analysis)是 JVM 的一种优化技术,用于分析对象的作用域,从而决定对象的分配方式或优化手段。 主要目的是判断一个对象是否会逃离当前方法或线程的作用域。 2. 逃逸分析的类型 2.1 方法逃逸 如果对象被方法外的代码引用,则该对象发生 阅读全文
posted @ 2024-12-11 00:38 Eiffelzero 阅读(510) 评论(0) 推荐(0)
摘要:Java 的 AOT(Ahead-Of-Time) 1. 定义 AOT(Ahead-Of-Time)编译是与 JIT(Just-In-Time)相对的一种编译方式。 在 AOT 模式下,Java 字节码(Bytecode)在程序运行之前,就被提前编译为目标平台的本地机器代码。 AOT 编译器:一个工 阅读全文
posted @ 2024-12-11 00:18 Eiffelzero 阅读(1446) 评论(0) 推荐(0)
摘要:JIT 编译后的代码存储位置 1. 存储位置 JIT 编译后的本地机器代码被存储在 JVM 的 Code Cache(代码缓存区)中。 Code Cache 是 JVM 内存的一部分,用于保存 JIT 编译生成的机器码,避免重复编译和提高代码执行效率。 2. Code Cache 的特性 作用: 存 阅读全文
posted @ 2024-12-10 23:55 Eiffelzero 阅读(318) 评论(0) 推荐(0)
摘要:Java 中的 JIT(Just-In-Time)编译器 1. JIT 的定义 JIT(Just-In-Time)编译器是一种用于 Java 虚拟机(JVM)的动态编译技术。它在 Java 程序运行时,将 Java 字节码(Bytecode)转换为本地机器代码,从而提高程序的运行效率。 位置:JIT 阅读全文
posted @ 2024-12-10 23:06 Eiffelzero 阅读(1597) 评论(0) 推荐(0)
摘要:Java 类加载器(ClassLoader) Java 中的类加载器是用于加载 .class 文件到 JVM 中的组件,它的核心作用是将字节码(.class 文件)加载到内存,并且使它能够被 JVM 执行。类加载器决定了类的加载顺序和加载方式,是 Java 应用程序在运行时执行的重要部分。 1. 类 阅读全文
posted @ 2024-12-10 22:39 Eiffelzero 阅读(290) 评论(0) 推荐(0)
摘要:Java 中的字符串常量池和运行时常量池 1. 字符串常量池(String Constant Pool) 定义 字符串常量池是 JVM 内存中专门用于存储字符串字面量和通过 intern() 方法加入的字符串对象的区域。它的目的是避免重复创建相同的字符串对象,以节省内存,并提高性能。 如何工作 每当 阅读全文
posted @ 2024-12-10 22:22 Eiffelzero 阅读(655) 评论(0) 推荐(2)
摘要:Java 中的常量池 Java 中的常量池(Constant Pool)是用于存放程序中常量(如字符串、数字、类、方法等)的内存区域。常量池的主要作用是提高内存的使用效率和性能,避免重复创建相同的常量实例。 常量池主要分为两种类型: 1. 字符串常量池(String Constant Pool) 定 阅读全文
posted @ 2024-12-10 22:09 Eiffelzero 阅读(310) 评论(0) 推荐(0)
摘要:Java 中的直接内存(堆外内存) 在 Java 中,直接内存(Direct Memory)指的是不受 JVM 堆管理的内存区域,也称为堆外内存。直接内存的使用通常与 Java NIO(New I/O)相关,尤其是通过 ByteBuffer.allocateDirect() 方法分配的内存。 1. 阅读全文
posted @ 2024-12-10 22:00 Eiffelzero 阅读(819) 评论(0) 推荐(0)
摘要:Java 中堆和栈的区别 Java 中的堆(Heap)和栈(Stack)是两种不同的内存区域,它们有着不同的用途和特点。以下是它们的主要区别: 1. 存储内容 堆:用于存储对象实例以及类的实例变量。所有通过 new 关键字创建的对象都会分配在堆中。 栈:用于存储方法调用时的局部变量和方法的执行上下文 阅读全文
posted @ 2024-12-10 21:51 Eiffelzero 阅读(417) 评论(0) 推荐(0)
摘要:JVM 有哪些情况会产生 OOM(内存溢出)? JVM 的内存溢出(OutOfMemoryError, OOM)是指程序在运行过程中,JVM 无法从操作系统申请到足够的内存,导致程序抛出内存溢出异常。OOM 可能发生在不同的内存区域,以下是常见的几种情况: 1. Java 堆内存溢出 发生原因 对象 阅读全文
posted @ 2024-12-10 21:44 Eiffelzero 阅读(552) 评论(0) 推荐(0)
摘要:JVM 方法区是否会出现内存溢出? 方法区内存溢出的可能性 方法区是 JVM 内存中的一个重要组成部分,存储类的元信息、静态变量和运行时常量池等。尽管它是一个独立的内存区域,但如果内存使用过多,也可能导致内存溢出(OutOfMemoryError)。 1. 原因 以下情况可能导致方法区发生内存溢出: 阅读全文
posted @ 2024-12-10 19:16 Eiffelzero 阅读(256) 评论(0) 推荐(0)
摘要:JVM 的内存区域划分 JVM 在运行时会将内存划分为多个区域,用于管理程序运行时的不同类型数据。以下是 JVM 内存的主要划分: 1. 方法区(Method Area) 定义: 方法区是运行时数据区的一部分,用于存储类的元信息(元数据)以及与类相关的常量。 存储内容: 类的元信息(类名、访问修饰符 阅读全文
posted @ 2024-12-10 19:07 Eiffelzero 阅读(281) 评论(0) 推荐(0)
摘要:编译执行与解释执行的区别 1. 编译执行(Compiled Execution) 定义: 将源代码一次性翻译为机器码(目标代码),生成可直接运行的二进制文件。 特点: 翻译只发生一次,生成的目标代码可以直接运行。 运行时速度快,因为无需再次翻译。 依赖于编译平台,目标代码可能需要为不同的硬件或操作系 阅读全文
posted @ 2024-12-10 18:57 Eiffelzero 阅读(464) 评论(0) 推荐(0)
摘要:JVM 的组成 JVM(Java Virtual Machine)是 Java 的核心组件,负责执行 Java 字节码程序。以下是 JVM 的主要组成部分: 1. 类加载子系统(Class Loader Subsystem) 作用:负责加载 .class 文件到 JVM,将其转换为 JVM 能识别的 阅读全文
posted @ 2024-12-10 18:43 Eiffelzero 阅读(137) 评论(0) 推荐(0)