【Java 虚拟机原理】Java 引用类型 ( 强引用 | 软引用 | 弱引用 | 虚引用 | 静态变量 )

简介: 【Java 虚拟机原理】Java 引用类型 ( 强引用 | 软引用 | 弱引用 | 虚引用 | 静态变量 )

文章目录

一、静态变量

二、 Java 引用类型 ( 强、软、弱、虚 )





一、静态变量


GC Root 对象 :


线程栈 中的 栈帧 中的 局部变量表 中的 引用对象 ;

方法区 中的 静态引用对象 ;

方法区 中的 常量引用对象 ;

本地方法栈 中的 JNI 中的 引用的对象 ;


所有的 静态变量 都是 GC Root 对象 , 一旦使用了静态变量 , 该变量涉及到的所有引用对象 , 都在以 GC Root 为起点的调用链中 , 这些对象始终都无法变为 垃圾对象 , 无法被回收 , 这就造成了内存泄漏 ;






二、 Java 引用类型 ( 强、软、弱、虚 )


参考博客 : 【Android 内存优化】Java 引用类型 ( 强引用 | 软引用 | 弱引用 | 虚引用 )



强引用 , StrongRefrence , Java 默认的引用 , 如果被 强引用 引用的对象 , 永远都不可能被回收 , 即使出现了 OOM ; 内存泄漏也是强引用导致的 ;


软引用 , SoftRefrence , 当 系统内存不足时 , 软引用即使还引用着对象 , 也要将该对象回收 ; 将要出现 OOM 时 , 会回收软引用 ;


弱引用 , WeakRefrence , 不管内存是否充足 , 每次 GC 垃圾回收 , 必定回收弱引用 ;


虚引用 , PhantomRefrence , 使用 get 获取对象时 , 获取到的是 null , 虚引用就是不存在的引用 , 几乎很少使用 ;



强引用 ( 不回收 ) > 软引用 ( OOM 前回收 ) > 弱引用 ( GC 必回收 ) > 虚引用 ( 回收前通知 )


如果单纯的想避免 OOM , 创建大对象时 建议使用软引用 ;



使用 软引用 , 弱引用 时 , 注意程序的逻辑 , 不要因为出现对象被系统回收 , 导致出现 空指针 异常之类的问题 , 要有备份方案 ;


目录
相关文章
|
缓存 JavaScript Java
怎么在Java 16中编写C风格的局部静态变量
Java 16通过 JEP 395 放宽了内层类声明静态成员的限制, 允许声明静态成员, 如记录类成员. 这项改进使得可以在局部范围内使用类似 C 风格的静态变量, 即局部变量仅初始化一次并在多次调用间共享. 例如, 缓存正则表达式模式, 以前需要将其置于类命名空间中, 现在可以保持在方法范围内
331 5
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
存储 安全 Java
探索 Java 静态变量(static)的奥秘
本文深入探讨了Java中的静态变量(`static`),从初印象、使用场景、访问方式、初始化、线程安全、优缺点到最佳实践,全面解析其特性和应用场景。静态变量属于类而非实例,适用于共享数据、定义全局常量和工具类中的变量。它在类加载时初始化,生命周期贯穿整个程序运行。然而,多线程环境下需注意线程安全问题,可通过`synchronized`或原子类解决。优点包括共享数据方便和提高性能,但也存在线程安全和代码耦合度增高的缺点。最佳实践建议谨慎使用、保证线程安全、遵循命名规范并封装访问。掌握静态变量的正确用法,能让你的代码更加高效简洁。
1224 11
Java 静态变量的初始化顺序
【10月更文挑战第15天】了解 Java 静态变量的初始化顺序对于正确编写和维护代码至关重要。通过深入理解初始化顺序的原理和细节,我们可以更好地避免潜在的问题,并提高代码的质量和可靠性。
|
Java
Java“非静态变量 ... 不能在静态上下文中被引用”解决
Java中遇到“非静态变量不能在静态上下文中被引用”的错误,通常是因为尝试在静态方法或静态块中访问实例变量。解决方法是将变量声明为静态(static)或通过实例对象来访问该变量。
1198 6
|
Java
Java常见JVM虚拟机指令(47个)
Java常见JVM虚拟机指令(47个)
337 3
Java常见JVM虚拟机指令(47个)
|
存储 算法 Java
Java虚拟机(JVM)的内存管理与性能优化
本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。
|
监控 算法 Java
深入理解Java虚拟机:内存管理与性能优化
在Java的世界里,虚拟机(JVM)是幕后的守护者,它默默地支撑着每一个字节码的运行。本文将揭开JVM的神秘面纱,探讨其内存管理机制及如何通过调优提升应用性能。从堆内存的分配到垃圾回收的策略,再到实践中的性能监控与调优技巧,我们将一同走进JVM的内部世界,学习如何让我们的Java程序跑得更快、更稳。
|
存储 Java 程序员
【一步一步了解Java系列】:何为数组,何为引用类型
【一步一步了解Java系列】:何为数组,何为引用类型
310 1
|
存储 算法 Java
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
本文介绍了 JVM 的内存区域划分、类加载过程及垃圾回收机制。内存区域包括程序计数器、堆、栈和元数据区,每个区域存储不同类型的数据。类加载过程涉及加载、验证、准备、解析和初始化五个步骤。垃圾回收机制主要在堆内存进行,通过可达性分析识别垃圾对象,并采用标记-清除、复制和标记-整理等算法进行回收。此外,还介绍了 CMS 和 G1 等垃圾回收器的特点。
465 0
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制