`
- 浏览:
149350 次
- 性别:
- 来自:
上海
-
再谈引用(强引用,软引用,弱引用,虚引用)的概念,回收方法区
再谈引用
无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象的引用链是否可达,判定对象是否存活都与“引用”有关。在JDK1.2之前,Java中的引用定义如下:如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用。这种定义很纯粹,但是太过狭隘,一个对象在这种定义下自由被引用或者没有被引用两种状态,对于如何描述一些食之无味,弃之可惜的对象就显得无能为力。
在JDK1.2以后,为了描述这样一类对象:当内存空间足够时,则能保留在内存中;如果内存空间在进行垃圾收集后还是非常紧张,则可以抛弃这些对象。为此,JDK1.2对引用的概念进行扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)4种,这4中引用强度逐渐减弱。
- 强引用是指在程序代码中普遍存在的,类似“Object obj = new Object()”这类的引用,只要强引用还存在,那么垃圾收集器永远不会回收掉被引用的对象。
- 软引用用来描述一些还有用但是非必须的对象。比如缓存。在系统将要发生内存溢出异常之前,垃圾收集器将会把这些对象列紧回收范围之中进行第二次回收。如果这次回收后还是没有足够的内存,那么会抛出内存溢出异常。在JDK1.2以后,提供了SoftReference类来实现软引用。
- 弱引用也是用来描述非必须对象的,它的强度比软引用更弱一些,呗弱引用关联的对象只能生存到下一次垃圾回收发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。在JDK1.2以后,提供了WeakReference类来实现弱引用。
- 虚引用也被称为幽灵引用或者幻影殷勇,它是最弱的一种引用关系。一个对象是否有虚拟用的存在,完全不会对其生存时间构成影响,也无法通过一个虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。在JDK1.2以后,提供了PhantomReference类来实现虚引用。
回收方法区
方法区也称为永久代,这里的垃圾收集主要回收两部分内容:废弃常量和无用的类。回收废弃常量与回收Java堆中的对象非常类似。
常量池中主要包含字面量、类(接口)、方法、字段的引用符号。
判断常量是否可回收的条件未:没有其他地方引用了这个字面量。
判断类是否可以(注意,这里仅仅是可以回收,不是必然回收)回收的条件有3个:
1、该类的实例都已经被回收,即Java堆中不存在该类的任何实例。
2、加载该类的ClassLoader已经被回收。
3、该类对应的java.lang.Class对象没有在任何地方被引用,并且无法在任何地方通过反射访问该类的方法。
是否对类进行回收,Hotspot虚拟机提供了-Xnoclassgc参数,-verbose:class以及-XX:+TraceClassLoading、-XX:+TraceClassUnloading查看类加载和卸载信息,其中-verbose:class和-XX:TraceClassLoading可以在Product版的虚拟机中使用,-XX:+TraceClassUnloading参数需要FastDebug版的虚拟机支持。
在大量使用反射、动态代理、cglib等bytecode框架、动态生成jsp以及osgi这类频繁自定义ClassLoader的场景都需要虚拟机具备卸载的功能,以保证方法区(永久代)不会溢出。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
从Java SE2开始,Java引入了四种不同类型的引用:强引用、软引用、弱引用和虚引用,它们各自具有不同的特点和用途,有助于程序员更精细地控制对象的生命周期,并优化垃圾回收过程。 1. 强引用(Strong Reference) ...
强引用、弱引用、软引用和虚引用是四种不同的引用强度,它们在垃圾回收机制中扮演着不同的角色。了解这些引用类型对于优化内存使用、防止内存泄漏以及合理地控制对象生命周期至关重要。 1. **强引用(Strong ...
Java对象的引用类型是Java内存管理中的重要概念,特别是在JDK 1.2及后续版本中引入了四种级别的引用:强引用、软引用、弱引用和虚引用,以提供更精细的控制对象生命周期的能力。 1. **强引用(StrongReference)**: ...
本文将深入探讨四种引用类型:强引用、软引用、弱引用和虚引用。 首先,我们来理解强引用(Strong Reference)。强引用是最常见的引用类型,它代表了程序中的普通对象引用。当一个对象被强引用指向时,该对象被认为...
这个"referenceInJava"项目专注于探讨四种不同类型的引用:强引用、软引用、弱引用和虚引用。这些引用类型与垃圾收集(Garbage Collection, GC)机制密切相关,对于优化内存使用和防止内存泄漏至关重要。 1. **强...
Java 中强引用、软引用、弱引用概念解析 Java 中强引用、软引用、弱引用是 Java 语言中三种不同的引用类型,每种引用类型都有其特点和应用场景,以下是对这三种引用类型的详细解释: 强引用 强引用是使用最普遍的...
Java中的引用类型分为四种级别,分别是强引用、软引用、弱引用和虚引用。在JDK1.2版本之前,对象的生命周期完全由强引用决定,即只要还有强引用指向一个对象,该对象就不会被垃圾回收器回收。但这种处理方式过于简单...
从JDK 1.2版本开始,Java引入了一种更为精细的引用类型管理机制,通过四种不同的引用类型:强引用、软引用、弱引用和虚引用,让开发者能够更加灵活地控制对象的生命周期。这种机制不仅提升了Java应用程序对内存使用...
了解 强引用、软引用、弱引用、虚引用的概念 在Java中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的...
这里我们将深入探讨“三级缓存”、“强引用”和“软引用”这三个核心概念,并通过BitmapUtils三层缓存的实现来阐述它们如何协同工作。 首先,我们来看“三级缓存”。在Android应用中,图片缓存通常分为三部分:内存...
Java提供了四种不同级别的引用类型:强引用、软引用、弱引用和虚引用(幻象引用),每种引用类型在内存管理中有不同的作用。 1. **强引用(Strong Reference)** - 强引用是最常见的引用类型,即通常的变量赋值。...
软引用是一种比弱引用更强的引用,只有在JVM认为内存不足的情况下,才会回收被软引用关联的对象。这种方式适用于创建缓存对象,比如在内存空间允许的情况下缓存图片或者大对象,而在系统内存不足时则可以被释放。...
在Java编程语言中,对象的引用机制是一个关键的概念,特别是从JDK 1.2版本开始引入的四种不同级别的引用:强引用、软引用、弱引用和虚引用。这些引用类型为开发者提供了更为精细的控制,帮助优化内存管理,尤其是在...
在JDK1.2之后,Java对引用的概念进行了扩展,提出了四种引用状态:强引用、软引用、弱引用、虚引用,这四种引用类型对对象的垃圾回收有不同的影响。 1. 强引用 强引用是最传统的引用,类似于"Object obj = new ...
在这里,我们将详细讲解Java中的四种引用类型:强引用、软引用、弱引用和虚引用,以及它们在内存管理和垃圾收集中的作用。 1. **强引用(Strong Reference)** - 强引用是Java中最常见的引用类型,它是默认的引用...
在Java中,`java.lang.ref`包提供了三种不同类型的引用:强引用(Strong Reference)、软引用(Soft Reference)和弱引用(Weak Reference)。我们主要关注弱引用,它通过`WeakReference`类来实现。弱引用对象在创建...
本示例“java引用的demo”将深入探讨四种不同类型的引用:强引用、软引用、弱引用和虚引用。这些引用类型对于理解和优化内存管理至关重要,特别是在Android开发中,因为良好的内存管理能够提升应用性能并防止内存...
- 弱引用:弱引用对象无论内存是否充足,只要检查到没有强引用指向它,就会被回收。 - 虚引用:虚引用并不直接控制对象的生命周期,只用于在对象被回收时收到通知。 3. 垃圾回收形式: - 垃圾回收是Java自动进行...
- **强引用**:最常见的引用类型,只要强引用存在,对象就不会被回收,即使系统面临内存溢出。过度使用强引用可能导致内存泄露。 - **软引用**:用于实现内存敏感的缓存,当内存不足时,垃圾收集器会清理软引用,...
一旦没有任何强引用或软引用指向对象,即使是弱引用,该对象也会被立即回收。 8. 虚引用(Phantom Reference):虚引用并不直接与对象相关联,只在对象被垃圾收集后,通过虚引用可以知道对象已被回收。主要用于跟踪...