在学习垃圾回收,有点不自信,在写程序时,先判断了哪儿符合了回收标准,但是不明白应该如何验证我的判断是正确的,
我是初学者,分析得也不一定对,想请教大家一下
写程序的时候,有什么测试方法没有,不是分析代码来判断,可以量化,观察所分配给一个对象的内存块已经被JVM回收了谢谢
我是初学者,分析得也不一定对,想请教大家一下
写程序的时候,有什么测试方法没有,不是分析代码来判断,可以量化,观察所分配给一个对象的内存块已经被JVM回收了谢谢
解决方案 »
- 有了解过MP3混缩的人吗
- 关于JList的事件监听的神奇现象
- java的一个句子理解?
- 请问学JAVA有那些方向,我现在不知道应该向哪方面学习
- 调用gcc等编译器,编译TextArea里的程序。
- 信息发送问题
- 急求:Bidr对象(如何通过通过scoket发送给服务端)是啥东西啊。
- ★★女朋友要过生日了!我想用java为她写一个程序,一举两得啊! 希望大家多提建议啊!谢谢!!!
- 请给一点关于java 变量,对象......命名规则方法还有技巧的资料,谢谢.
- 问大家一个初级问题,但是我实在是做不出来
- 一个框架程序编译运行正常,为何不显示结果
- 一个项目中,不启动项目,想调试其中一个类中的一个方法,我在这个类中添加了main来调用这个方法,请问如何能做到这样调式
还没学过,难道真有这样的方法?
可惜这儿讨论的是JVM啊,呵呵。谢谢你的参与,呵呵
Test t = new Test();
SoftReference<Test> soft = new SoftReference<Test>(t);
/* WeakReference<Test> weak = new WeakReference<Test>(t);*/
t = null;
System.gc();
if (soft.get()==null) {
System.out.println("obj 已经被清除了 ");
} else {
System.out.println("尚未被清除");
}
}
这个??有点问题吧?如果用来测试下面这段程序的话并不能显示有内存块A的回收吧?
import java.lang.ref.SoftReference;public class TestA{
public static void main(String []args){
TestA aa = new TestA();//设此处所分配的内存块为A
TestA bb = new TestA();//设此处所分配的内存块为B
SoftReference <TestA> soft1 = new SoftReference <TestA>(A);
SoftReference <TestA> soft2= new SoftReference <TestA>(B);
aa = bb;
System.out.println(soft1.get());
System.out.println(soft2.get());
}
}至此内存块A应该会符合了回收条件,但是程序运行永远都是类似如下:
TestA@de6ced
TestA@c17164
并不表示内存块已经被回收,或者符合了回收标准。你在我的另外一个帖子里说此时内存块并不会被回收,但是我的问题是如果不被回收的话不就内存块A永远被分配出去了,即无法利用,也无法回收,浪费了吗?
System.out.println("i am a garbage");
super.finalize();
}然后在你做了 一切事情后 让对象变成垃圾加上System.gc();参考代码
public class T{
public static void main(String[] args) {
T t = new T();
t = new T();
System.gc();
}
@Override
protected void finalize() throws Throwable {
System.out.println("i am a garbage");
super.finalize();
}
}
java中把对象的引用分为四种级别,分别是强引用、软引用、弱引用和虚引用强引用
所有对象默认强引用,对于强引用,垃圾回收器一般不回收,哪怕冒内存溢出的风险,
这就是有的程序运行时总报OutOfMemoryError,但查看后却发现代码并没有问题的原因
软引用(SoftReference)
当内存空间足够,软引用跟强引用一样,GC不回收
当内存空间不够,GC才回收
弱引用(WeakReference)
不论内存够不够,GC都回收
虚引用(PhantomReference)
虚引用同弱引用,但使用时有区别
jprofile
之类的工具可以看看
jprofile
之类的工具可以看看