一直听说将不用的对象置为NULL,可以加迅被GC回收,但又听见另一种观点说置NULL不会被GC.倒底会不会加速呢,本人不太懂GC的机制,但也可以知道置NULL有没有用,写个代码测试一下就OK了.贴代码:
public class LoopObject
{
public static void main(String[] args)
{
LoopObject lo;
for (int i = 0; i < 100000; i++)
{
lo = new LoopObject();
}
}
}
javac LoopObject.java
为了公平,执行了五次运行命令,每执行一次,复制记录一下:
java -verbosegc LoopObject
结果如下:
[GC 896K->161K(5056K), 0.0013781 secs]
[GC 896K->161K(5056K), 0.0013644 secs]
[GC 896K->161K(5056K), 0.0013768 secs]
[GC 896K->161K(5056K), 0.0013536 secs]
[GC 896K->161K(5056K), 0.0013715 secs]
被置为空后的代码:
public class LoopObject
{
public static void main(String[] args)
{
LoopObject lo;
for (int i = 0; i < 100000; i++)
{
lo = new LoopObject();
lo = null;
}
}
}
javac LoopObject.java
为了公平,执行了五次运行命令,每执行一次,复制记录一下:
java -verbosegc LoopObject
结果如下:
[GC 896K->161K(5056K), 0.0013662 secs]
[GC 896K->161K(5056K), 0.0013609 secs]
[GC 896K->161K(5056K), 0.0013539 secs]
[GC 896K->161K(5056K), 0.0013664 secs]
[GC 896K->161K(5056K), 0.0014042 secs]
结果对比,用前段代码的GC回收时间减去后一段代码的回收时间:
0.0000119、0.0000035、0.0000229、-0.0000128、-0.0000327
从结果上看,感觉差不多。。。。。。可能是例子太简单的,那么再写个复杂的代码
import java.util.Hashtable;
public class LoopObject
{
public static void main(String[] args)
{
Hashtable<Object, Object> ht;
for (int i = 0; i < 100000; i++)
{
ht = new Hashtable<Object, Object>();
}
}
}
javac LoopObject.java
执行了三次运行命令,每执行一次,复制记录一下:
java -verbosegc LoopObject
结果如下:
[GC 896K->161K(5056K), 0.0013631 secs]
[GC 1057K->161K(5056K), 0.0004871 secs]
[GC 1057K->161K(5056K), 0.0002996 secs]
[GC 1057K->161K(5056K), 0.0001650 secs]
[GC 1057K->161K(5056K), 0.0001509 secs]
[GC 1057K->161K(5056K), 0.0001557 secs]
[GC 1057K->161K(5056K), 0.0001597 secs]
[GC 1057K->161K(5056K), 0.0001625 secs]
[GC 1057K->161K(5056K), 0.0002215 secs]
[GC 1057K->161K(5056K), 0.0001568 secs]
[GC 896K->161K(5056K), 0.0013520 secs]
[GC 1057K->161K(5056K), 0.0005030 secs]
[GC 1057K->161K(5056K), 0.0003084 secs]
[GC 1057K->161K(5056K), 0.0001522 secs]
[GC 1057K->161K(5056K), 0.0001523 secs]
[GC 1057K->161K(5056K), 0.0001546 secs]
[GC 1057K->161K(5056K), 0.0001626 secs]
[GC 1057K->161K(5056K), 0.0001473 secs]
[GC 1057K->161K(5056K), 0.0002252 secs]
[GC 1057K->161K(5056K), 0.0001502 secs]
[GC 896K->161K(5056K), 0.0013446 secs]
[GC 1057K->161K(5056K), 0.0004839 secs]
[GC 1057K->161K(5056K), 0.0003243 secs]
[GC 1057K->161K(5056K), 0.0001527 secs]
[GC 1057K->161K(5056K), 0.0001585 secs]
[GC 1057K->161K(5056K), 0.0001537 secs]
[GC 1057K->161K(5056K), 0.0001669 secs]
[GC 1057K->161K(5056K), 0.0002167 secs]
[GC 1057K->161K(5056K), 0.0001568 secs]
[GC 1057K->161K(5056K), 0.0001760 secs]
import java.util.Hashtable;
public class LoopObject
{
public static void main(String[] args)
{
Hashtable<Object, Object> ht;
for (int i = 0; i < 100000; i++)
{
ht = new Hashtable<Object, Object>();
ht = null;
}
}
}
重新编译后并执行
javac LoopObject.java
执行了三次运行命令,每执行一次,复制记录一下:
java -verbosegc LoopObject
[GC 896K->161K(5056K), 0.0013605 secs]
[GC 1057K->161K(5056K), 0.0004848 secs]
[GC 1057K->161K(5056K), 0.0003503 secs]
[GC 1057K->161K(5056K), 0.0001571 secs]
[GC 1057K->161K(5056K), 0.0001541 secs]
[GC 1057K->161K(5056K), 0.0001685 secs]
[GC 1057K->161K(5056K), 0.0001570 secs]
[GC 1057K->161K(5056K), 0.0001546 secs]
[GC 1057K->161K(5056K), 0.0001561 secs]
[GC 1057K->161K(5056K), 0.0001341 secs]
[GC 896K->161K(5056K), 0.0014766 secs]
[GC 1057K->161K(5056K), 0.0004738 secs]
[GC 1057K->161K(5056K), 0.0003499 secs]
[GC 1057K->161K(5056K), 0.0001562 secs]
[GC 1057K->161K(5056K), 0.0001534 secs]
[GC 1057K->161K(5056K), 0.0001450 secs]
[GC 1057K->161K(5056K), 0.0001547 secs]
[GC 1057K->161K(5056K), 0.0001607 secs]
[GC 1057K->161K(5056K), 0.0001585 secs]
[GC 1057K->161K(5056K), 0.0001300 secs]
[GC 896K->161K(5056K), 0.0013647 secs]
[GC 1057K->161K(5056K), 0.0004726 secs]
[GC 1057K->161K(5056K), 0.0003491 secs]
[GC 1057K->161K(5056K), 0.0001531 secs]
[GC 1057K->161K(5056K), 0.0001437 secs]
[GC 1057K->161K(5056K), 0.0001537 secs]
[GC 1057K->161K(5056K), 0.0001530 secs]
[GC 1057K->161K(5056K), 0.0001282 secs]
[GC 1057K->161K(5056K), 0.0001714 secs]
[GC 1057K->161K(5056K), 0.0001593 secs]
从这次的结果中不难看出,多加了一行置空的代码,还真有点效果,只是不知道这些效果对系统性能有没有什么提高呢
分享到:
相关推荐
•使用final修饰局部变量时既可以在定义时指定默认值,也可以不指定默认值。 •给局部变量赋初始值,只能一次,不能重复。 final修饰基本类型和引用类型 •当使用final修饰基本数据类型时,不能对其重新...
- **透明度**: 减少对具有透明度的大对象的使用可以显著减少CPU负担。 **2、CPU睡眠模式和暂停模式** - **睡眠模式**: 当游戏不活跃时,可以进入睡眠模式,减少CPU使用。 **3、当不需要鼠标事件的时候将...
当应用程序或特定组件不再需要这些监听器时,如果没有及时取消注册,将会导致原本可以被垃圾回收的对象继续被系统保留,从而引发内存泄漏。 **示例解析**: 假设我们需要在锁屏界面上监听电话服务的状态变化。为此...
不可达的对象即视为垃圾,GC会进行回收。 2. **能否立即回收**:通常,GC会根据其内部策略自动决定何时进行垃圾回收。程序员可以调用`System.gc()`尝试触发垃圾回收,但并不保证GC一定会执行,因为这取决于JVM的具体...
在使用`Hashtable`或`Dictionary, string>`时,直接获取对象然后检查是否为`null`通常比使用`ContainsKey`或`Contains`方法更高效。这能有效避免不必要的哈希码计算和等值比较。 #### 减少循环内的操作 减少循环内...
- **null的作用**:用于表示对象引用未初始化或被显式设置为空。 - **NullPointerException**:当尝试访问null引用的对象成员时会抛出该异常。 #### 12. Java中Comparable与Comparator的区别 - **Comparable接口**...
- **当一个用户A将自己拥有的权限给了用户B,当我们回收用户A的权限时,用户B的权限也自动被回收** 正确。在MySQL中,如果用户A使用WITH GRANT OPTION授予了权限给用户B,那么当用户A的权限被收回时,用户B的相应...
文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半手工地管理内存,以及如何使用垃圾收集自动管理内存。 为什么必须管理内存 内存管理是计算机编程最为基本的...
文将对 Linux™ 程序员可以使用的内存管理技术进行概述,虽然关注的重点是 C 语言,但同样也适用于其他语言。文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半...
主键约束在一个表中,只能定义一个,定义为主键约束的可以是列或者列的组合,其中不能包含重复值,并且不能包含 NULL 值。 #### 外键约束 是让两个表通过外键建立关系。在使用外键约束时,被引用的列应该具有主键...
8. **适应不同数据源**: 如果你的数据源是List、DataTable或其他类型,你可以根据需要将它们转换为二维数组。例如,对于List,可以使用Linq的`Select`和`ToArray`方法;对于DataTable,可以使用`GetRows`和`...
10. **垃圾回收**:垃圾回收(GC)自动回收不再使用的对象,释放内存。主要机制包括标记-清除、复制、标记-整理、分代收集等。 11. **Error与Exception**:Error表示系统级错误,无法通过程序处理,如虚拟机错误;...
- **内存泄露**:不再使用的对象没有被垃圾回收机制及时回收,导致内存占用持续增加。 - **内存溢出**:当程序申请内存超过系统所能提供的最大内存时,会出现内存溢出错误。 ##### 单例 - **目的**:确保某个类...
- GC(Garbage Collection):自动管理内存,回收不再使用的对象。 - 特点: - 自动触发。 - 无需手动释放内存。 以上就是针对给定的ASP.NET面试题所涉及的主要知识点总结。希望这些内容能够帮助你更好地理解...
5. **使用扩展方法**:扩展方法可以为非类实例添加新功能,而不必修改原始类。 6. **理解并应用面向对象原则**:包括封装、继承和多态,这是C#的基础。 7. **学习泛型**:泛型提供了一种创建可重用组件的方法,...
- **概念**:`as`关键字用于尝试将一个对象转换为另一个类型,如果转换失败,则返回null。 - **优势**:相比强制类型转换(`(Type)object`),`as`更加安全,不会抛出异常。 #### 4. 使用 ConditionalAttributes (`#...