gpt4 book ai didi

java - 是否真的有必要在 JUnit 拆卸方法中使对象无效?

转载 作者:搜寻专家 更新时间:2023-10-30 19:40:09 24 4
gpt4 key购买 nike

<分区>

我对 answer 很感兴趣到一个类似的问题。我认为这是不正确的。所以我创建了一些测试代码。我的问题是,这段代码是否证明/反驳/不确定在拆卸方法中取消成员变量有用的假设?我用 JUnit4.8.1 测试了它。

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'ed。但是 Test1 obj 没有被取消,它在 Test2 中得到了 gc。这表明没有必要使对象无效。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com