В настоящее время я исправляю проблемы с памятью в долгом проекте, и я столкнулся с особенно жадной до памяти проблемой. Проблема в том, что класс содержит очень большую статическую структуру данных, а также статический класс remoteSubscriber. Мы используем TimerTask для периодической регистрации абонента в удаленном месте.
Для этого соответствующие поля передаются таймеру, который создает полную копию класса ConnectionManager. Это включает в себя массивную структуру данных.
Чтобы не допустить того, чтобы наш самый голодный к данным объект дважды , я хотел бы найти способ использовать эти поля таким образом, чтобы не требовалось копировать весь родительский объект в новый Нить. RMI приходит на ум, но есть ли другой вариант, а?
Вот некоторый псевдокод проблемы:
public class ConnectionManager{
private static volatile ConnectionManager INSTANCE=new ConnectionManager();
private BigFatStructure bigMama;
private RemoteSubscriber remoteSubscriber;
private ConnectionManager() {
}
public void initConnection() {
//initializes fields
}
private static void connect() {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new KeepAliveTask(remoteSubscriber),SOMEVALUE,SOMEVALUE);
try {
registerSubscriber();
} catch (DistributionException e) {
}
}
public static ConnectionManager getInstance() {
if(INSTANCE==null){
synchronized(ConnectionManager.class){
if(INSTANCE==null){
INSTANCE=new ConnectionManager();
}
}
}
return INSTANCE;
}
}
public class KeepAliveTask extends TimerTask {
private RemoteSubscriber remoteSubscriber;
public KeepAliveTask(Subscriber remoteSubscriber){
this.remoteSubscriber=remoteSubscriber;
}
@Override
public void run() {
if (ConnectionManager.getInstance().getRemoteSubscriber() != null) {
try {
try {
IRemoteService service = MyProvider.getService();
service.register(remoteSubscriber);
} catch (Exception e) {
throw new DistributionException(e);
}
} catch (DistributionException e) {
}
}
}
}
Как лучше всего предотвратить, чтобы новый поток содержал отдельную копию ConnectionManager?
Заранее спасибо!
edit: изменен код и описание, чтобы лучше отражать обновленное состояние