今天的话题是在清理对象的时候是使用=null还是gc,我们下面做出比较。
1.写这篇文章的缘由
之前我写了一篇文章是对象的清理(点击跳转),有一位网友给了另外一种方法,因此我特意使用visual vm来测试一下看看。
2.使用检测工具 visual vm
下载地址:https://java.net/projects/visualvm/downloads/download/release138/visualvm_138.zip
使用参考文章:
使用 VisualVM 进行性能分析及调优
3.测试用例
下面是使用gc来清理:
package com.ray.ch05;
public class Test {
public static void main(String[] args) throws InterruptedException {
Thread.sleep(15000);
System.out.println("begin time:" + DateUtil.getNow());
for (long i = 0; i < 1999999999; i++) {
Test test = new Test();
// test = null;
System.gc();
}
System.out.println("end time:" + DateUtil.getNow());
}
}
从上面两个图可以看见,使用gc的时候test所使用的内存比较少,形成的实例非常少,但是由于经常gc,因此cup占用非常高,而且不稳定,还有gc的时间非常长,上面的数据是没有完成所有gc的数据,但是也能说明一些问题。
下面我们来使用=null来清理对象:
代码
package com.ray.ch05;
public class Test {
public static void main(String[] args) throws InterruptedException {
Thread.sleep(15000);
System.out.println("begin time:" + DateUtil.getNow());
for (long i = 0; i < 1999999999; i++) {
Test test = new Test();
test = null;
// System.gc();
}
System.out.println("end time:" + DateUtil.getNow());
}
}
从上图可以看见,当使用=null来清空对象的时候,cup占用也高,但是比较平稳,内存的使用比gc要高大概25%,生成大量的实例,但是有一个比较明显的优势,就是执行时间短,据笔者观察,当Test的实例到达某个数量的时候,它就会突然下降,个人推测那个时候执行了gc,只是推测,没有实际根据。
总结:其实使用=null的方式并不是真的清空对象,对象只是被回收,需要等到某一个时间才清理,而gc就直接是清理,但是,使用=null的执行速度快,使用gc的执行速度慢。
以上只是笔者粗略的观察,有问题请指出,谢谢。
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
在Java中,程序员通过`new`关键字创建对象,而对象的释放则无需手动操作,只要将对象的所有引用置为`null`,使其变为“不可达”,GC就会在合适的时候回收这部分内存。 GC的工作原理基于有向图的概念,它跟踪堆...
在Java中,GC通常使用有向图结构来记录和管理堆(heap)中的所有对象,以此来判断哪些对象是可达的,哪些是不可达的。当GC发现某些对象不再可达时,它们的内存空间就会被回收。 尽管GC的基本任务是明确的,但Java规范...
1. **及时清理无用的引用**:一旦确认某个对象不再需要,应尽快将其引用设为`null`,以便GC能及时回收。 2. **谨慎使用静态变量**:静态变量具有全局可见性和应用程序生命周期的持续性,应避免在静态集合中存储长...
在Java中,由于具备垃圾回收机制(GC),理论上开发者不必担心内存泄露问题。然而,在实际应用中,仍然存在一些特殊情况会导致内存泄露的发生。 #### 二、内存泄露的原因分析 1. **未及时关闭资源**:例如文件句柄、...
这些面试题涵盖了 Java 开发的基础知识,包括 JDK 与 JRE 的区别、对象比较、Hibernate 框架的理解、垃圾回收机制以及 JVM 参数调优,这些都是 Java 开发者需要掌握的重要知识点。了解并熟练运用这些知识,将有助于...
在这个例子中,尽管局部变量`o`被设置为`null`,但由于`v`集合仍然保持着对这些对象的引用,所以这些对象不会被GC回收。这种情况下,即使程序不再需要这些对象,它们也会持续占用内存空间,从而导致内存泄露。 ####...
虚引用(PhantomReference)是最弱的一种引用,它不能通过get()方法得到对象的实际引用,这意味着任何时候虚引用都不可能与目标对象的引用关联。虚引用的主要作用是跟踪对象被垃圾回收器回收的活动,它的主要用途是...
Java初始化和清理是Java语言中非常重要的两个过程,它们确保了Java程序的正确运行和资源的有效管理。Java的初始化包括类的加载、连接和初始化三个过程,而清理则主要指垃圾回收机制。 首先,Java初始化的主要特性...
**3.6 基本类型与对象** - **基本类型**: 包括 `boolean`, `char`, `byte`, `short`, `int`, `long`, `float`, `double`。 - **默认值**: - 基本类型在类中定义时有默认值(如 `int` 默认为 `0`),但在方法中定义...
- **垃圾回收(GC)**:自动管理内存的过程,用于释放不再使用的对象所占用的内存空间。 - **字符串处理**:Java中字符串是不可变的。使用`new String()`创建字符串时,会创建一个新的对象,即使字符串池中已经存在...
### 程序避免被GC回收——引用 ...以上就是关于Java中如何避免对象被GC回收的关键知识点介绍。通过合理利用不同类型的引用,可以在一定程度上控制对象的生命周期,从而优化内存使用效率,提高应用程序的性能。
**1.3 作用域与对象寿命** - 在Java中,对象同样具有作用域的概念。一旦对象超出其作用域,它就不再被引用,从而成为垃圾回收的目标。 - 如果希望某些成员变量或方法在整个程序生命周期内都是可用的,可以使用`...
- GC主要负责回收不再使用的对象,这些对象通常是超出作用域或被显式设置为`null`的对象。 - 垃圾回收器工作在堆内存上,但不回收栈内存中的数据。 - GC的工作时机不确定,一般情况下,当系统空闲时或堆内存使用...
Java垃圾收集器会在适当的时候自动进行垃圾收集,通常不需要程序员手动干预,除非调用`System.gc()`建议进行垃圾收集,但这并不保证立即执行。 2. **方法重载**:题目中的代码展示了方法重载,即一个类中有两个同名...
当一个对象变成一个垃圾对象的时候,如果此对象的内存被回收,那么就可以调用系统中定义的 finalize 方法来完成垃圾回收的操作。 finalize 方法的作用是,在对象被垃圾回收器回收之前,做一些必要的清理工作。例如...
JAVA的垃圾回收机制(GC)自动跟踪和清理不再使用的对象,防止内存泄漏。虽然JAVA的自动垃圾回收减轻了程序员管理内存的负担,但有时仍需人工干预,比如通过调用`System.gc()`来建议JVM执行垃圾回收。 ### 10. 异常...
- **作用**:当垃圾回收器准备回收一个对象时,若该对象定义了 `finalize` 方法,则垃圾回收器会尝试调用此方法,以便对象能够释放资源或执行清理工作。 - **示例**: ```java protected void finalize() throws...
Java的垃圾回收(GC)机制是其内存管理的核心部分,它自动检测并回收不再使用的对象,以避免内存泄漏和系统不稳定。GC的存在使得Java程序员无需手动管理内存,降低了程序出错的可能性。 GC的基本原理是基于对象的...
23. `equals()` 比较对象内容,`==` 比较对象引用。 24. 构造器不能被重写,但可以重载。 25. 不可以继承 `String` 类,因为 `String` 是 final 类。 26. `switch` 不能作用在 `byte`、`long` 或 `String`(JDK 7...
- 对象跟踪:可以使用虚引用跟踪对象的生命周期,比如在对象被回收时执行一些清理工作。 - 内存泄漏检测:通过虚引用可以在对象被回收时记录下来,从而帮助开发者检测潜在的内存泄漏问题。 ##### 示例代码 ```java...