`

JVM创建一个新对象到底有多大的代价?

阅读更多

        好像是在听一人讲JVM性能调优方面事时, 知道了尽量减少JVM创建对象,因为那样会消耗不少资源. 有了这样的mindset后,自己编码也就尽可能地少创建对象了.

        但看jBPM时,发现每一个请求都要创建一个JbpmContext对象,纳闷的同时也反思先前的那个mindset的正确性,或者说在什么条件下是正确的.

        想到一个例子: Hibernate从数据库取出数据后,都是要以对象的形式来封装的, 那样的每次DB操作至少要创建一个对象的. 这样一想,JbpmContext的创建相比于Hibernate操作DB时对象的创建就可以忽略了.

        做个暴力实验来看下, 创建新对象时JVM的耗时:

        实验用的代码很简单, 如下所示:

for(int i=0;i< 10000;i++) {
	new Object();
}
 



    实验结果如下:

循环次数(也就是创建Object实例的次数)     耗时(毫秒)
1000000000                                             22094
100000000                                                 2282
10000000                                                     219
1000000                                                         31
100000                                                             0
10000                                                               0

现在用的机器配置: Pentium(R) 4 CPU 2.40GHz, 1G内存, 操作系统是 Windows XP(2002版本), SP3.

    从上面的结果看出: 只有在100万次时才有明显的耗时,而这时的耗时也才只31毫秒,而我做实验的机子很破的. 这样在真正的项目中,也就不必多考虑新建一个对象时的耗时了.

    这里只是做了个耗时的实验, 这个耗时背后又倒底做了些什么? 又有哪些是耗时的主犯呢? 抛砖引玉, 期待大家的讨论.

分享到:
评论
8 楼 ZangXT 2009-08-07  
按照gc group的一个报告:
Typically, object allocation is very cheap!
● 10 native instructions in the fast common case
● No remembered set overhead on new objects
● C/C++ has faster allocation? Not!
● Reclamation of new objects is very cheap too!
● Young GCs in generational systems
● So
● Do not be afraid to allocate small objects for
intermediate results
● GCs love small, immutable objects
● Generational GCs love small, short-lived objects

用Object对象测估计说明不了多大问题。

[url]
http://developers.sun.com/learning/javaoneonline/2007/pdf/TS-2906.pdf
[/url]
7 楼 rmn190 2009-04-14  
The common code path for new Object() in HotSpot 1.4.2 and later is approximately 10 machine instructions. (from: http://www.ibm.com/developerworks/java/library/j-jtp09275.html?S_TACT=105AGX52&S_CMP=cn-a-j)
6 楼 wendong007 2009-04-08  
如果是比较复杂的对象的,如果构造方法本身的执行方法本来就很长呢
5 楼 量产型人型自走炮 2009-04-02  
JVM没测试过
但是在flash的VM中创建对象的开销貌似是挺大的
我曾经写过一个AIR的本地播放器类似这种
http://222.243.146.200/html/anime/20090402/25579.html
结果是把所有评论在加载时全部创建为控件对象
比加载时存为字符串在播放时动态创建与释放控件(在同一时间需要创建的弹幕数量比教大时)要流畅得多
当然这里的控件的创建开销不是一个object能比的
4 楼 sulong 2009-04-02  
垃圾收集已经针对大量的短命对象优化过了。创建大量的这样的对象对性能没有太大的影响。
3 楼 RednaxelaFX 2009-04-02  
如果是用Sun Hotspot的话,可以开-XX:+PrintGCDetails开关来观察到底GC在什么时候做了什么事。

跟随楼主,测试这样一段代码:
public class TestObjectCreation {
    private static void foo() {
        final int MAX = 10000000;
        for (int i = 0; i < MAX; ++i) {
            new Object();
        }
    }
    
    public static void main(String[] args) {
        foo();
    }
}


查看JIT出来的结果,感觉挺意外的。foo()方法基本上没被优化,i放在了EBX里,每个循环规规矩矩的递增;循环体内的new Object()也规规矩矩的每次都被调用。我原本来以为在方法足够热的时候,Hotspot能把这个新建对象的动作优化掉的。看来要么是这个方法还不够热,要么是……我也不清楚,没读过那部分源码。
2 楼 抛出异常的爱 2009-04-02  
GC时间?
1 楼 sulong 2009-04-02  
除了真的进行复杂的科学计算,否则普通的应用,性能瓶颈一般都发生在IO上,这IO包括,读写磁盘,socket,等。IO操作的代码往往会成为那个给你带来80%性能损失的那20%的代码。

相关推荐

    面向对象和JVM内存模型.pdf

    Java对象跟JVM讲解,Java对象跟JVM讲解,Java对象跟JVM讲解,Java对象跟JVM讲解,Java对象跟JVM讲解,Java对象跟JVM讲解,

    对象在jvm中的存储情况

    java对象在jvm中的存储情况 jvm

    java面向对象之JVM创建及分配策略方法详解.docx

    在Java中我们有几种方式可以创建一个新的对象呢?总共有以下几种方式: new关键字 反射 clone 反序列化 Unsafe.allocateInstance 为了便于说明和理解,下文仅针对new出来的对象进行讨论。

    一个jvm启动多个springboot服务

    一个jvm启动多个springboot服务

    JVM中对象的生命周期

    关于JVM中对象的生命周期的讲解,不错!!

    Jvm对象内存分配理解

    如果 Java 堆中的内存并不规整,已使用的内存和空闲内存相互交错,Jvm 就需要维护一个列表,记录上哪些内存块中可用的。在分配的时候,从列表中找到一块足够大的空间分配给对象实例,并且更新到列表上的记录。 解决...

    JVM垃圾回收机制

    Jvm垃圾回收机制 by linux_14胡嘉辉1.如何确定某个对象是“垃圾”? 2.典型的垃圾收集算法3.典型的垃圾收集器

    java性能调优-jvm创建对象和-performance-createobj-allocationmemory.zip

    java性能调优-jvm创建对象和-performance-createobj-allocationmemory

    R大(国内JVM权威)资料合集

    R大(国内JVM权威)资料合集R大(国内JVM权威)资料合集R大(国内JVM权威)资料合集R大(国内JVM权威)资料合集R大(国内JVM权威)资料合集R大(国内JVM权威)资料合集

    面向大数据处理框架的JVM优化技术综述

    当前,以Hadoop、Spark为...这些大数据处理框架采用分布式架构,使用Java、Scala等面向对象语言编写,在集群节点上以Java虚拟机(JVM)为运行时环境执行计算任务,因此依赖JVM的自动内存管理机制来分配和回收数据对象.

    JVM 面试题总结.md

    - 如何判断一个不再使用的类? - JVM 分代收集理论有哪些? - 聊一聊 JVM 中的垃圾回收算法? - 标记-清除算法 - 标记-复制算法 - 标记-整理算法 - 什么是记忆集,什么是卡表?记忆集和卡表有什么关系? - ...

    JVM面试资料:JVM结构、JVM调优、四大垃圾回收算法、七大垃圾回收器

    JVM面试资料。 JVM结构:类加载器,执行引擎,本地方法接口,本地内存结构; 四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 七大垃圾回收器:Serial、Serial Old、ParNew、CMS、Parallel...

    jvm源码jvm源码jvm源码

    jvm源码

    String s = new String(” a “) 到底产生几个对象?

    上图红色的这3个箭头,对于通过new产生一个字符串(”宜春”)时,会先去常量池中查找是否已经有了”宜春”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”宜春”对象的拷贝对象。...

    jvm 配置jvm参数

    jvm 配置jvm参数 配置jvm参数

    JVM Dump与Java对象的内存布局

    介绍了heap dump和thread dump,以及详细介绍dump工具Memory Analyzer的使用,最后讲解了Java对象的内存布局。

    慢慢的回味.entry_point–JVM Java栈桢的创建1

    每个方法都对应一个栈桢,栈桢包含了方法的局部变量、操作数栈、方法返回地址等信息。在Java程序执行过程中,JVM会根据方法的调用关系创建和销毁栈桢。 二、栈桢的结构 栈桢的结构可以分为以下几个部分: * 局部...

    jvm_jvm新手_jvm_

    一个jvm的学习资料,对新手很有帮助,建议收藏

    jdk,jvm源码

    jvm源码,jvm-native的源码,jvm支行机制,可对jvm的运行过程进行分析 个人网站:https://www.zhangjunbk.com

    JVM的GC如何判断对象是否死亡?

      我们都知道Java和C++有一个非常大的区别就是Java有自动的垃圾回收机制,经过半个多世纪的发展,Java已经进入了“自动化”时代,让使用者只需要注重业务逻辑的开发而不需要担心内存的使用情况。那么我们为什么...

Global site tag (gtag.js) - Google Analytics