Java匿名对象的性能优势分析

  • 1. 匿名对象
  • 2. Java创建对象的过程
  • 3. 性能差异
  • 存储上的性能差异
  • 垃圾回收上的差异
  • 4. 继续
  • 5. 总结


今天思考了一下java在使用匿名方式创建对象和普通的句柄方式对java传递对象的性能进行了一点简单的思考,可能不是很全面,在某些方面的理解也能有些偏差,欢迎各位大佬探讨指正!

首先阐明结论:
对于能够使用匿名对象进行对象创建和传递的时候,是具有一定性能优势的,尤其是对于大量对象创建的时候,差异更加明显。(抛开数量谈效率都是耍流氓)

要分析Java使用匿名对象所带来的性能优势,我们首先要对java在内存中创建对象的过程有一定的了解,并对两种创建对象方式见存在的差异进行分析,才能够体会到一些些细小的细节所带来的不同。下面我们逐个分析。

PS. 对于java内存模型不是很了解的朋友可以先读一下我之前的几篇文章,对知识有一个完整的体系,回过头来继续往下看也不迟!
从Java的各种基本数据类型看Java内存区域结构划分Java包装类及自动装箱、拆箱

1. 匿名对象

顾名思义,匿名就是没有名字的对象,在创建对象时,只通过new的动作在堆内存开辟空间,却没有把堆内存空间的地址值赋值给栈内存的某个变量用以存储。

2. Java创建对象的过程

看过引文里的两篇文章之后,相信你已经对Java的内存模型有了一定的了解,让我们继续分析java在创建对象时的过程。

  1. 看下面这条语句:
Student s = new Student();

对应的再看下面这张图:

java中匿名函数 java匿名函数性能_性能优势分析

在执行上面那句代码的时候在栈内存中分配栈帧,并在堆内存中开辟Student对象的空间,并由栈内存指向堆内存中实际的对象地址。

  1. 匿名创建
new Student().要执行的方法;

java中匿名函数 java匿名函数性能_Java匿名对象_02

使用匿名的方法创建对象,仅在堆内存中为其分配了内存,并不存在由栈内存到堆内存中的对象引用。

3. 性能差异

存储上的性能差异

观察上面的两张图我们可以看到,由于使用匿名对象不需要分配栈内存,且无需进行引用指向,在大量创建对象的时候能够节约很多的栈空间,且数量越多越明显。

垃圾回收上的差异

Java的GC机制根据对象的引用数量判断该对象是否可达,若对象不可达,则会判定该对象为垃圾,在下一次垃圾回收的时候进行回收。
使用匿名对象的好处就是使用完毕就是垃圾,可以在垃圾回收器空闲时回收,节省内存空间。

4. 继续

既然匿名对象使用完了就回收了,为什么要使用呢?
我们能够使用匿名对象调用方法。那么为什么说匿名对象调用方法有意义呢?方法存在于栈空间,当在内存中创建的对象调用方法时,JVM开始为局部变量开辟内存空间,方法开始执行,方法强调其功能,对象调用方法可以完成其功能,所以匿名对象调用方法有意义。

那么为什么不声明为静态呢?
静态的内容属于类,并不属于每一个具体的对象,在设计方面存在差异。、

5. 总结

在需要注意系统性能的应用中,使用匿名对象创建的方式能够减少栈帧的分配和指向,且在调用完毕后能够被GC机制快速的回收。但在具体使用的时候需要注意其使用场景,若后续仍需要使用该对象,那么匿名的方式可能就不是个好的选择了。