我被answer吸引到了類似的問題。我相信這是不正確的。所以我創建了一些測試代碼。我的問題是,這段代碼是否證明/反駁/不確定假設:在拆解方法中使成員變量無效是有用的假設?我用JUnit4.8.1測試了它。是否真的有必要在JUnit拆卸方法中取消對象?
JUnit爲4個測試中的每個測試創建一個測試類的新實例。每個實例都包含一個Object obj。這個obj也被插入爲靜態WeakHashMap的關鍵字。如果當JUnit釋放其對測試實例的引用時,關聯的obj值將變爲弱引用並因此符合gc。測試試圖強制一個gc。 WeakHashMap的大小會告訴我這個objs是否被gc化了。有些測試會使obj變量無效,而另一些則不會。
import org . junit . Before ;
import org . junit . After ;
import org . junit . Test ;
import java . util . ArrayList ;
import java . util . WeakHashMap ;
import java . util . concurrent . atomic . AtomicInteger ;
import static org . junit . Assert . * ;
public class Memory
{
static AtomicInteger idx = new AtomicInteger (0) ;
static WeakHashMap < Object , Object > map = new WeakHashMap < Object , Object > () ;
int id ;
Object obj ;
boolean nullify ;
public Memory ()
{
super () ;
}
@ Before
public void before ()
{
id = idx . getAndIncrement () ;
obj = new Object () ;
map . put (obj , new Object ()) ;
System . out . println ("<BEFORE TEST " + id + ">") ;
}
void test (boolean n)
{
nullify = n ;
int before = map . size () ;
gc () ;
int after = map . size () ;
System . out . println ("BEFORE=" + before + "\tAFTER=" + after) ;
}
@ Test
public void test0 ()
{
test (true) ;
}
@ Test
public void test1 ()
{
test (false) ;
}
@ Test
public void test2 ()
{
test (true) ;
}
@ Test
public void test3 ()
{
test (false) ;
}
@ After
public void after ()
{
if (nullify)
{
System . out . println ("Nullifying obj") ;
obj = null ;
}
System . out . println ("<AFTER TEST " + id + ">") ;
}
/**
* Try to force a gc when one is not really needed.
**/
void gc ()
{
ArrayList <Object> waste = new ArrayList <Object> () ;
System . gc () ; // only a suggestion but I'll try to force it
list :
while (true) // try to force a gc
{
try
{
waste . add (new Object ()) ;
}
catch (OutOfMemoryError cause)
{
// gc forced? should have been
waste = null ;
break list ;
}
}
System . gc () ; // only a suggestion but I tried to force it
}
}
我跑使用命令行接口(利用-Xmx128k選項來增加垃圾收集)的代碼,並得到了以下結果
.<BEFORE TEST 0>
BEFORE=1 AFTER=1
Nullifying obj
<AFTER TEST 0>
.<BEFORE TEST 1>
BEFORE=2 AFTER=1
<AFTER TEST 1>
.<BEFORE TEST 2>
BEFORE=2 AFTER=1
Nullifying obj
<AFTER TEST 2>
.<BEFORE TEST 3>
BEFORE=2 AFTER=1
<AFTER TEST 3>
的TEST0 OBJ被撤銷,在Test1的是GC 「編。但Test1 obj沒有被取消,它在Test2中得到了證明。這表明無效對象不是必需的。
這是最好的答案。在JUnit 3.x中,消除是必要的(以避免內存泄漏)。如果您使用JUnit4.x並且不需要默認運行程序無效化。如果您使用自定義亞軍,那麼您可能需要取消。 – emory 2010-09-08 00:37:27