关于内存使用的问题 在方法中可能要大量生成对象或者申请大片的内存,这时候是要尽早将引用置null呢,还是申请一片内存,重复利用的好?如果是前者,垃圾收集器应该是方便回收,但是申请内存耗费资源应该不少吧,而且垃圾收集器回收也比较慢,如果是后者,重复利用,自然效率更高,但是垃圾收集器就无法回收了,不知道是不是会影响系统的效率。内存对象 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不用的尽早引用置null,这样垃圾回收器会回收掉,可以尽量释放内存 你怎么做到“申请一片内存,重复利用”?JAVA里面你没办法控制内存,你只能用new 申请堆内存创建对象,不能控制这片内存的清理,更不能指定再次使用这片内存。如果方法内创建大量对象,可以考虑将部分用完的对象提前用代码显式地指向NULL。但是一般的方法不需要这么做,方法结束局部变量的引用都会自动失效的。 你创建一个Object数组,把第一个位置指向了object1,再把第一个位置改为NULL,object1并不会在内存消失,你只是消除了数组对这个object1的引用,什么时候这个对象被回收,JVM才有决定权。就算你再把第一个位置再指向另一个对象object2,这个object2占用的内存也是在它被new出来的时候决定的,无论是和数组,还是和object1都没有一点关系。 ……我用的是int这样的数组……引用和本身的内容的区别我当然知道了 太虚了,举个例子吧。代码 public static void main(String[] args){ int[] a = new int[1]; a[0] = 0; //都是给局部基本类型变量赋值0,但是b的效率要远高过c int b = 0; int c = a[0]; }反解析下这段代码的编译文件: public static void main(java.lang.String[]); flags: ACC_PUBLIC, ACC_STATIC Code: stack=3, locals=4, args_size=1 0: iconst_1 1: newarray int 3: astore_1 4: aload_1 5: iconst_0 6: iconst_0 7: iastore 8: iconst_0 //0压栈 9: istore_2 //0弹出给变量b 10: aload_1 //数组a的引用入栈 11: iconst_0 //下标0入栈 12: iaload //查找数组a的下标0对应数值,并把该数值压栈 13: istore_3 //刚才压入的数值弹出给变量c 14: return LineNumberTable: line 3: 0 line 4: 4 line 7: 8 line 8: 10 line 9: 14很明显,原本直接赋值只需要压栈出栈2步就行了,而按照你的想法,弄个堆内存数组做缓存,反而需要4步,而且第三步需要根据引用去堆内存找,效率不是大幅提高了,而是大幅降低了。 你多虑了,基本类型最大的也就是long类型,一共才8个字节,不可能存在一次调用几KB的情况。你说的用个基本类型数组缓存,跟直接赋值的区别只在赋值时的效率上,计算中是没区别的。只要一个基本类型变量被赋值后,这个变量相关的计算操作中,所有的中间值存储都在栈上进行,所有的计算靠的是CPU,跟作为值来源的数组一点关系都没有了。 想用java编写一个测试打字速度的程序,要用到线程(就像金山打字通那样) 树的问题。。(数据结构0 挺有趣的东东 swing中布局的问题 求救:很菜的问题!!! 请问大家在一个同步代码中的异常问题 接口内常量调用的问题~~~~~~~~~~高手帮忙解释一下~~~ 先谢谢了~~~~ 如何实现在SWING窗体内打开PDF 请问闪烁短信是如何实现的,能否说一下,或提供资源! visual cafe 和forte for java 可以在那儿下载呀? 帮我加点注释intn=30到nj*=i;,谢了 请问这个正则表达式怎么写?
JAVA里面你没办法控制内存,你只能用new 申请堆内存创建对象,不能控制这片内存的清理,更不能指定再次使用这片内存。如果方法内创建大量对象,可以考虑将部分用完的对象提前用代码显式地指向NULL。但是一般的方法不需要这么做,方法结束局部变量的引用都会自动失效的。
代码 public static void main(String[] args){
int[] a = new int[1];
a[0] = 0;
//都是给局部基本类型变量赋值0,但是b的效率要远高过c
int b = 0;
int c = a[0];
}
反解析下这段代码的编译文件: public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=4, args_size=1
0: iconst_1
1: newarray int
3: astore_1
4: aload_1
5: iconst_0
6: iconst_0
7: iastore
8: iconst_0 //0压栈
9: istore_2 //0弹出给变量b
10: aload_1 //数组a的引用入栈
11: iconst_0 //下标0入栈
12: iaload //查找数组a的下标0对应数值,并把该数值压栈
13: istore_3 //刚才压入的数值弹出给变量c
14: return
LineNumberTable:
line 3: 0
line 4: 4
line 7: 8
line 8: 10
line 9: 14
很明显,原本直接赋值只需要压栈出栈2步就行了,而按照你的想法,弄个堆内存数组做缓存,反而需要4步,而且第三步需要根据引用去堆内存找,效率不是大幅提高了,而是大幅降低了。
你多虑了,基本类型最大的也就是long类型,一共才8个字节,不可能存在一次调用几KB的情况。
你说的用个基本类型数组缓存,跟直接赋值的区别只在赋值时的效率上,计算中是没区别的。
只要一个基本类型变量被赋值后,这个变量相关的计算操作中,所有的中间值存储都在栈上进行,所有的计算靠的是CPU,跟作为值来源的数组一点关系都没有了。