锁定老帖子 主题:java优化编程--读书笔记
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-12-10
呵呵 一定要在发贴之前好好搞清楚哦~
|
|
返回顶楼 | |
发表时间:2009-12-10
pan_java 写道 zhxing 写道 总结的不错,不过下载的就有点那个了,不是那本书。。感觉被名字忽悠了。
另外: 字符串累加采用StringBuffer 现在已经用StringBuilder 来代替了。。。 书google 一下到处都是,我是在CSDN下载的 stringBuffer 线程安全 stringBuilder 非线程安全. 所以不考虑多线程的话,stringBuilder 速度肯定是快点 |
|
返回顶楼 | |
发表时间:2009-12-10
whaosoft 写道 呵呵 一定要在发贴之前好好搞清楚哦~
好的,谢谢! |
|
返回顶楼 | |
发表时间:2009-12-10
pan_java 写道 3.避免在循环体中创建对象,即使该对象点用内存空间不大. for(int i=0;i<10000;++i){ Object obj = new Object(); System.out.println("obj="+obj); } 应改成 Object obj = null; for(int i=0;i<10000;++i){ obj = new Object(); System.out.println("obj="+obj); } 严重的没发现第二种创建的对象数要少些。 Object obj = null; 只是声明了一个空的 Object 引用而已,真正创建Object 对象的是 new Object() ,这两者创建的对象难道不是一样多的? |
|
返回顶楼 | |
发表时间:2009-12-10
最后修改:2009-12-10
wps2000 写道 pan_java 写道 3.避免在循环体中创建对象,即使该对象点用内存空间不大. for(int i=0;i<10000;++i){ Object obj = new Object(); System.out.println("obj="+obj); } 应改成 Object obj = null; for(int i=0;i<10000;++i){ obj = new Object(); System.out.println("obj="+obj); } 严重的没发现第二种创建的对象数要少些。 Object obj = null; 只是声明了一个空的 Object 引用而已,真正创建Object 对象的是 new Object() ,这两者创建的对象难道不是一样多的? 我觉得 Object obj = null; for(int i=0;i<10000;++i){ obj = new Object(); System.out.println("obj="+obj); } 只在栈内存中有一个obj,obj指向不同堆内存中的new出来的Object对象, 其实这样是节省内存的开销, 我是这么理解的! |
|
返回顶楼 | |
发表时间:2009-12-10
最后修改:2009-12-10
楼主说的第一个问题很常见但我有个问题:java在堆中分配内存只和new有关系,虽然修改后只有一个obj引用,但其实内存中还是分配了i个对象。我想问下各位,如果单就此例子我写的这个是否和楼主修改后的性能相同:
for(int i=0;i<10000;++i){ Object obj = new Object(); System.out.println("obj="+obj); obj = null; } |
|
返回顶楼 | |
发表时间:2009-12-10
ystt8283 写道 楼主说的第一个问题很常见但我有个问题:java在堆中分配内存只和new有关系,虽然修改后只有一个obj引用,但其实内存中还是分配了i个对象。我想问下各位,如果单就此例子我写的这个是否和楼主修改后的性能相同:
for(int i=0;i<10000;++i){ Object obj = new Object(); System.out.println("obj="+obj); obj = null; } 个人 认为 比楼主的性能差。 |
|
返回顶楼 | |
发表时间:2009-12-10
changyuxin 写道 wps2000 写道 pan_java 写道 3.避免在循环体中创建对象,即使该对象点用内存空间不大. for(int i=0;i<10000;++i){ Object obj = new Object(); System.out.println("obj="+obj); } 应改成 Object obj = null; for(int i=0;i<10000;++i){ obj = new Object(); System.out.println("obj="+obj); } 严重的没发现第二种创建的对象数要少些。 Object obj = null; 只是声明了一个空的 Object 引用而已,真正创建Object 对象的是 new Object() ,这两者创建的对象难道不是一样多的? 我觉得 Object obj = null; for(int i=0;i<10000;++i){ obj = new Object(); System.out.println("obj="+obj); } 只在栈内存中有一个obj,obj指向不同堆内存中的new出来的Object对象, 其实这样是节省内存的开销, 我是这么理解的! 用jprofiler之类的内存剖析工具看一下运行时堆内存你就知道了,循环不结束的时候你new出来的这些Object是不会呗GC的。 |
|
返回顶楼 | |
发表时间:2009-12-10
如果有两层以上的循环,要将多次计算的循环放在里面,少的放在外面;
另外for(int i=n;i>0;i--)的效率比for(int i=0;i<n;i++)的效率高 |
|
返回顶楼 | |
发表时间:2009-12-10
wubo19842008 写道 用jprofiler之类的内存剖析工具看一下运行时堆内存你就知道了,循环不结束的时候你new出来的这些Object是不会呗GC的。
大大可否用JProfiler演示一下?请问为什么小的测试的时候看到这些Object被GC了? public class X { public static void main(String[] args) { Object obj = null; for(int i=0; i<10000; ++i) { obj = new Object(); System.out.println("obj="+obj); } } } $ java -version java version "1.6.0_17" Java(TM) SE Runtime Environment (build 1.6.0_17-b04) Java HotSpot(TM) Client VM (build 14.3-b01, mixed mode, sharing) $ java -XX:+PrintGC X | grep 'GC' [GC 896K->134K(5056K), 0.0008089 secs] [GC 1030K->134K(5056K), 0.0002564 secs] [GC 1030K->134K(5056K), 0.0001279 secs] [GC 1030K->134K(5056K), 0.0000553 secs] [GC 1030K->134K(5056K), 0.0000581 secs] [GC 1030K->134K(5056K), 0.0000616 secs] [GC 1030K->134K(5056K), 0.0000497 secs] |
|
返回顶楼 | |