.NET утечка памяти Remoting Singleton, TCP, Маршал Ссылкой

Это - один из тех случаев, где суррогатный ключ в значительной степени всегда имеет смысл. Существуют случаи, где Вы или выбираете то, что является лучшим для базы данных или что является лучшим для Вашей объектной модели, но в обоих случаях, с помощью бессмысленного ключа или GUID лучшая идея. Это делает индексацию легче и быстрее, и это - идентификационные данные для Вашего объекта, который не изменяется.

6
задан Community 23 May 2017 в 12:26
поделиться

3 ответа

Разве там, где ваша служба создает экземпляр объекта,

serviceConfigRemote = new serviceConfigDataRemote();

не должно выглядеть как

serviceConfigRemote = serviceConfigDataRemote.Instance;

?

]По крайней мере, Таким образом, вы создаете два разных экземпляра на стороне сервера: один в статическом инициализаторе члена instance , который будет использоваться свойством Instance , а другой - через свойство новая явная конструкция serviceConfigDataRemote () . Вам также может пригодиться добавление частного конструктора к этому классу, чтобы ничто другое не могло создать экземпляр синглтона, кроме статического инициализатора.

Это может быть не решением проблемы постоянно увеличивающейся памяти, но определенно кажется чем-то проблемы, которую необходимо решить.

РЕДАКТИРОВАТЬ:

Вот еще пара советов, которые я нашел при поиске в сетях:

  • Добавьте [MTAThread] к основному методу службы хоста.
  • RemotingServices.Disconnect (this.serviceConfigRemote); , когда вы закрываете службу хоста.
3
ответ дан 17 December 2019 в 07:05
поделиться

Вы пробовали использовать отложенное создание экземпляров на своем синглтоне? Возможно, ему не нравится способ его создания.

public sealed class serviceConfigDataRemote : MarshalByRefObject
    {
        private bool myConnectedFlag;
        private bool mySendingFlag;
        private bool myUpdateFlag;
        private string myClientConfiguration;

        static serviceConfigDataRemote instance;

        static serviceConfigDataRemote()
        {
        }

        public serviceConfigDataRemote()
        {
            myConnectedFlag = false;
            mySendingFlag = false;
            myUpdateFlag = false;
            myClientConfiguration = "";
        }

        public static serviceConfigDataRemote Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (new Object())
                    {
                        if (instance == null)
                        {
                            instance = new serviceConfigDataRemote();
                        }
                        return instance;
                    }
                }
                return instance;
            }
        }

        public override object InitializeLifetimeService()
        {
            return (null);
        }


        public bool Connected
        {
            get { return myConnectedFlag; }
            set { myConnectedFlag = value; }
        }

        public bool Sending
        {
            get { return mySendingFlag; }
            set { mySendingFlag = value; }
        }

        public bool CheckForUpdates
        {
            get { return myUpdateFlag; }
            set { myUpdateFlag = value; }
        }

        public string ClientConfiguration
        {
            get { return myClientConfiguration; }
            set { myClientConfiguration = value; }
        }
    }
1
ответ дан 17 December 2019 в 07:05
поделиться

Поскольку единственная ОС, в которой вы видите эту ошибку, - это XP, существует несколько возможных проблем.

  1. XP имеет ограничение на входящее соединение 10 (на Pro) или 5 (на домашнем компьютере). ), и это может сыграть свою роль в проблеме.

  2. Убедитесь, что установлены все пакеты обновления / исправления. Я знаю, что это может быть банальным и банальным ответом на любые проблемы, но тот факт, что эта проблема появляется только в XP, подразумевает, что она связана с ОС.

Кроме того, не знаю, как вы используете службу, но Windows XP - это настольный компьютер. ОС, а не серверная ОС. Если вы хотите, чтобы служба была сервером какого-либо типа, вам действительно следует использовать 2000/2003/2008 и т. Д., Тем более что у нее есть проблемы только с XP.

0
ответ дан 17 December 2019 в 07:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: