基本上,可以把
JVM
内存中的对象引用理解成一种有向图,把引用变量、对象都当成为有向图的顶点,将引用关系当成图的有向边,有向边总是从引用端指向被引用的
Java
对象。因为
Java
所有对象都是由一条一条线程创建出来的,因此可以把线程对象当成有向图的起始顶点。采用有向图来管理内存中的对象具有较高的精度,但缺点是效率较低。
当一个对象在堆内存中运行时,根据它在对应有向图中的状态,可以把它所处的状态分成可达状态、可恢复状态和不可达状态。其中,可恢复状态指对象已经没有任何引用变量引用它,系统的垃圾回收机制准备回收该对象所占的内存。但在回收之前,系统调用该对象的
finalize
方法进行资源清理,如果系统在调用
finalize
方法重新让一个以上引用变量引用该对象,则这个对象会再次变为可达状态;否则,该对象进入不可达状态。需要注意的是,一个对象的
finalize
方法只会被调用一次。
一个对象可以被一个方法局部变量所引用,也可以被其他类的类变量引用,或者被其他对象的实例变量所引用。
强引用
由于
JVM
肯定不会回收强引用所引用的
Java
对象,因此强引用是造成
Java
内存泄露的主要原因之一。
软引用
对于只有软引用的对象而言,当系统内存空间足够时,它不会被系统回收,程序也可使用该对象;当系统内存空间不足时,系统将会回收它。
弱引用
对于只有弱引用的对象而言,当系统垃圾回收机制运行时,不管系统内存是否足够,总会回收该对象所占用的内存。
软引用和弱引用都会造成引用的对象为
null
的现象,为此,需要在使用引用对象前判断对象是否为空,如果为空就重建该对象。
虚引用
如果一个对象只有一个虚引用,那它和没有引用的效果大致相同。虚引用主要用于跟踪对象被垃圾回收的状态,虚引用不能单独使用,虚引用必须和引用队列(
ReferenceQueue
)联合使用。
需要指出的是,要使用这些特殊的引用类,就不能保留对对象的强引用。如果保留了对对象的强引用,就会浪费这些类所提供的任何好处。
堆内存的分代回收
分代回收策略基于以下两点事实:
l
绝大多数对象不会被长时间引用,这些对象在
Young
期间就会被回收;
l
很老的对象和很新的对象之间很少存在相互引用的情况。
Permanent
代主要用于装载
Class
、方法等信息,默认为
64M
,垃圾回收机制通常不会回收
Permanent
代中的对象。对于像
Hibernate
、
Spring
这类喜欢
AOP
动态生成类的框架,往往会生成大量的动态代理类,因此需要更多的
Permanent
代内存。
内存管理的小技巧
l
尽量使用直接量
l
使用
StringBuilder
和
StringBuffer
进行字符串连接(其中StringBuffer是线程安全版本)
l
尽早释放无用对象的引用
l
尽量少用静态变量
l
避免在经常调用的方法、循环中创建
Java
对象
l
缓存经常使用的对象
l
尽量不要使用
finalize
方法
l
考虑使用
SoftReference
分享到:
相关推荐
Java内存管理是编程中至关重要的一个环节,尤其是对于大型、长时间运行的应用来说,内存泄漏和内存无法回收可能导致系统性能下降,甚至导致系统崩溃。本文将深入探讨Java内存泄露的原理,分析内存无法回收的原因,并...
Java的内存回收, 及时的回收内存资源,更有利于程序的稳定性
Java内存回收机制 Java的内存管理主要集中在堆(Heap)区域,其中对象的创建通常是通过`new`关键字或反射方式完成,而对象的释放则由Java虚拟机(JVM)通过垃圾回收(GC)机制自动处理。对象回收的基本原则是:当一个...
一、Java对象在内存引用状态 内存泄露:程序运行过程中,会不断分配内存空间,那些不再使用... 强引用是Java编程中广泛使用的引用类型,被强引用所引用的Java对象绝不会被垃圾回收机制回收,即使系统内存紧张;即使
Java内存回收机制是Java虚拟机(JVM)自动管理内存的一种策略,它的主要目标是确保程序的稳定运行,同时减少因手动内存管理可能导致的错误。Java程序员无需像C++那样显式地分配和释放内存,这使得编程更加简单,但也...
#### 二、Java内存回收机制 Java的内存管理机制主要依赖于垃圾回收器(Garbage Collection, GC),这是一种自动化的内存管理方式。当对象不再被引用时,GC会自动将其从内存中移除,释放其占用的空间。然而,这种机制...
#### 一、Java内存回收机制 Java中的内存管理主要依赖于垃圾回收(Garbage Collection, GC)机制。与C/C++等需要手动管理内存的语言不同,Java虚拟机(JVM)自动处理对象的创建与销毁过程。当通过`new`或反射方法...
#### 一、Java内存管理 1. **运行时数据区**:Java虚拟机管理的内存主要分为以下几个部分: - **方法区(Method Area)**:存储类的信息(如类名、字段、方法等)、常量、静态变量等。每个JVM实例只有一个方法区,...
资源名称:Java内存管理机制相关资料汇总资源目录:【】java内存回收机制及预防【】java内存管理机制【】java内存管理白皮书【】Java虚拟机内存管理_对象和引用_空指针【】深入理解java虚拟机jvm高级行与最佳实践...
在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险。但是,也正因为内存管理完全由...
Java内存机制是Java虚拟机(JVM)的关键组成部分,它管理着程序运行时的数据存储。在Java中,内存主要分为以下几个区域: 1. **Heap(堆)**:这是Java中最主要的内存区域,用于存储所有的类实例和数组。当堆空间...
总的来说,Java内存管理和垃圾回收机制是Java平台的基石,它们使得开发者可以专注于编写代码,而不必担心内存管理的细节。理解这些概念对于优化程序性能、避免内存溢出等问题至关重要。通过合理地分配和管理内存,...
通过简单的java程序测试Linux服务器内存使用、回收情况,排查Linux服务器内存使用异常的情况
JAVA内存模型与垃圾回收是Java开发中至关重要的概念,它们直接影响到程序的性能和稳定性。首先,我们来看看Java内存模型。 Java内存模型,通常被称为JVM内存模型,它定义了程序中不同部分如何访问和共享数据。在...
"深入了解java内存分配和回收策略" java内存分配是java技术体系中的一个核心问题,java技术体系中所提到的内存自动化管理归根结底就是内存的分配与回收两个问题。下面我们将深入了解java内存分配和回收策略。 一、...
- Java内存管理的核心是对象生命周期的管理,当一个对象不再被引用时,垃圾回收器会将其占用的内存空间回收。 2. **垃圾回收器的工作原理** - **可达性分析**:垃圾回收器通过一系列称为“根”(如局部变量、静态...
在堆中分配的内存,由 Java 虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了...