Как предотвратить создание копии объекта при статическом вызове из другого потока - PullRequest
0 голосов
/ 09 июля 2019

В настоящее время я исправляю проблемы с памятью в долгом проекте, и я столкнулся с особенно жадной до памяти проблемой. Проблема в том, что класс содержит очень большую статическую структуру данных, а также статический класс 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: изменен код и описание, чтобы лучше отражать обновленное состояние

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Вы можете использовать шаблон Singleton, чтобы иметь один уникальный объект.

https://www.javatpoint.com/singleton-design-pattern-in-java

Взгляните на шаблоны проектирования Java, это проверенные решения для решения конкретной проблемы / задачи.

https://www.javatpoint.com/design-patterns-in-java

0 голосов
/ 09 июля 2019

Мы решили проблему. Причина была в том, что класс «ConnectionManager» существовал в 2 пакетах, и каким-то образом отдельный объект обрабатывался другой частью программы. Этот другой объект ранее использовался для другой функции, но поскольку он был удален некоторое время назад, просто увольнение кода, который загружал другой ConnectionManager, полностью устранил проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...