LinkedBlockingQueueo类中的take方法执行后不释放内存,怎么办
LinkedBlockingQueueo类中的take方法执行后不释放内存,怎么办?
如代代码所示,sender 发送线程要比reader快,会产生积压,但是按理说take是从队首移除,那么移除后应释放内存才对
,但是好久好久都没有释放,并且我用System.gc()释放,也是一样不行,请大家帮帮忙。
示例代码:
package domain.message;
import java.util.concurrent.LinkedBlockingQueue;
import resource.FaultAlarm;
public class Test
{
private static LinkedBlockingQueue< FaultAlarm > alarmList = new LinkedBlockingQueue< FaultAlarm >();
public static void main( String[] args )
{
Sender s = new Sender( alarmList ) ;
Reader r = new Reader( alarmList ) ;
s.start() ;
r.start() ;
}
}
class Sender extends Thread
{
LinkedBlockingQueue< FaultAlarm > alarmList ;
public Sender(LinkedBlockingQueue< FaultAlarm > alarmList )
{
this.alarmList = alarmList;
}
public void run()
{
int i = 0 ;
while( i < 300000 )
{
++ i ;
FaultAlarm faultAlarm = new FaultAlarm() ;
faultAlarm.setAlarmnumber( "msg.getValByName" ) ;
faultAlarm.setAlarmobject( "msg.getValByName" ) ;
faultAlarm.setObjclass( "msg.getValByName" ) ;
faultAlarm.setAlarmtype( "msg.getValByName" ) ;
faultAlarm.setProbablecause( "msg.getValByNa" ) ;
faultAlarm.setAlarmdesc( "msg.getValByName" ) ;
faultAlarm.setAlarmlevel( "msg.getValByName" ) ;
faultAlarm.setAlarmtext( "msg.getValByName(" ) ;
faultAlarm.setStarttime( "msg.getValByName" ) ;
faultAlarm.setIscleared( "msg.getValByName" ) ;
faultAlarm.setIsacked( "msg.getValByName" ) ;
faultAlarm.setEndtime( "msg.getValByName" ) ;
faultAlarm.setAcktime( "msg.getValByName(" ) ;
faultAlarm.setClearperson( "msg.getValByName(" ) ;
faultAlarm.setAckperson( "msg.getValByName" ) ;
faultAlarm.setBelongequip( "msg.getValByName" ) ;
faultAlarm.setVendor( "msg.getValByName(" ) ;
faultAlarm.setBelongshelf( "msg.getValByName(" ) ;
faultAlarm.setBelongsubshelf( "msg.getValByName(" ) ;
faultAlarm.setBelongstation( "msg.getValByName" ) ;
faultAlarm.setBelonghouse( "msg.getValByName( " ) ;
faultAlarm.setBelongtransys( "msg.getValByName(" ) ;
faultAlarm.setBelongframe( "msg.getValByName( " ) ;
faultAlarm.setBelongslot( "msg.getValByName(" ) ;
faultAlarm.setBelongpack( "msg.getValByName( " ) ;
faultAlarm.setBelongport( "msg.getValByName( " ) ;
faultAlarm.setRemark( "msg.getValByName( " ) ;
faultAlarm.setAlarmTrend( "msg.getValByName( " ) ;
faultAlarm.setSubnetName( "msg.getValByName( " ) ;
try
{
System.out.println( "加入对象:" + i ) ;
alarmList.put( faultAlarm ) ;
if( i == 250000 )
{
Thread.sleep( 15000 ) ;
}
}
catch ( InterruptedException e )
{
e.printStackTrace() ;
}
}
try
{
Thread.sleep( 100000 ) ;
}
catch ( InterruptedException e )
{
e.printStackTrace() ;
}
}
}
class Reader extends Thread
{
LinkedBlockingQueue< FaultAlarm > alarmList ;
public Reader(LinkedBlockingQueue< FaultAlarm > alarmList )
{
this.alarmList = alarmList;
}
public void run()
{
FaultAlarm obj ;
while( true )
{
try
{
Thread.sleep( 1 ) ;
obj = alarmList.take() ;
}
catch ( InterruptedException e )
{
e.printStackTrace();
}
}
}
}