论坛首页 Java企业应用论坛

Java优化编程--内存管理

浏览 5930 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2009-09-24  
java.lang.Object 写道
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.hadeslee.test5;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Hadeslee
 */
public class Test1 {

    public static void main(String[] args) {
        long from = System.currentTimeMillis();
        List<Person> list = new ArrayList<Person>();
        long free1 = Runtime.getRuntime().freeMemory();
//        Person p = null;
        for (int i = 0; i < 1000000; i++) {
            Person p = new Person("name", i);
            list.add(p);
        }
        System.out.println("time:" + (System.currentTimeMillis() - from) + "ms!");
        System.out.println("memory:" + (free1 - Runtime.getRuntime().freeMemory()) + "bytes");
    }
}

class Person {

    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 自己测一下,不要以讹传讹.

 在循环体内声明和在循环体外声明是一样的,执行速度并没有差别。

 内存使用就一模一样了。

对,你可用jprofiler 看一下heap区,看看这个对象的count,声明在循环的里面和外面在循环没有结束是都是不会被gc的。

0 请登录后投票
   发表时间:2009-09-24  
我用"java.lang.Object"的程序测试了一下,两种情况下有差异,但比较小。
又在循环体内每当循环次数为100000的整数倍时,打印内存情况,发现在循环体内声明比在循环体外声明内存占用大 8 byte,每次对应的打印都是这样。
这样看起来,两种情况的确差异很小。
不知测试方法有没有问题,请大家发表看法。
0 请登录后投票
   发表时间:2009-09-24  
ningmenglovesoft 写道
我不知道我说的对不对,
for(int i = 0 ; i < 10000 ;i++){
   Person person = new Person();


}
如果是这样的话。那么应该每一个次循环都会在栈创建一个引用和在堆中重新开辟一块内存空间,也就是说一万个引用指向一万个堆空间。
Person person = null;
for(int i = 0; i < 10000; i++){
  person = new Person();
}
如果是这样好像在整个循环期间应该只有一个引用。指向不同的堆空间。

我想这还是有性能的差异吧。

差别是有,但是很小,差别就是创建一个引用和一万一个引用之间的差别吧,但是在循环体内创建的话,一个循环过后该引用就已经失效了,或许在你循环的过程中垃圾回收站已经回收了,如果你循环的次数够多,应该是在循环体内创建的先内存溢出的。
0 请登录后投票
   发表时间:2009-09-24  
实在想不明白的就去看反汇编代码吧。
javap -verbose 类名
可以看到栈大小

直接比较引用变量在循环内外两种情况的反编译代码也很容易。
0 请登录后投票
   发表时间:2009-09-24  
obj=null这种优化,只要开启逃逸分析 -XX:+DoEscapeAnalysis 就能得到大幅改善。
0 请登录后投票
论坛首页 Java企业应用版

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