论坛首页 入门技术论坛

java优化编程--读书笔记

浏览 9882 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-12-10  
呵呵 一定要在发贴之前好好搞清楚哦~
0 请登录后投票
   发表时间:2009-12-10  
pan_java 写道
zhxing 写道
总结的不错,不过下载的就有点那个了,不是那本书。。感觉被名字忽悠了。

另外:
字符串累加采用StringBuffer

现在已经用StringBuilder 来代替了。。。


书google 一下到处都是,我是在CSDN下载的

stringBuffer 线程安全 stringBuilder 非线程安全. 所以不考虑多线程的话,stringBuilder 速度肯定是快点
0 请登录后投票
   发表时间:2009-12-10  
whaosoft 写道
呵呵 一定要在发贴之前好好搞清楚哦~


好的,谢谢!
0 请登录后投票
   发表时间: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() ,这两者创建的对象难道不是一样多的?
0 请登录后投票
   发表时间: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对象,
其实这样是节省内存的开销,

我是这么理解的!
0 请登录后投票
   发表时间: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;
  }
0 请登录后投票
   发表时间: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;
  }


个人 认为 比楼主的性能差。
0 请登录后投票
   发表时间: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的。
0 请登录后投票
   发表时间:2009-12-10  
如果有两层以上的循环,要将多次计算的循环放在里面,少的放在外面;
另外for(int i=n;i>0;i--)的效率比for(int i=0;i<n;i++)的效率高
0 请登录后投票
   发表时间: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]
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics