|
![]() |
#1 |
Участник
|
А как тогда интерпретировать это?
X++: static void JobXXXX(Args _args) { DictTable dictTable; DictTable dictTable2; HeapCheck hc = new HeapCheck(); ; info (strfmt("Кол-во объектов в памяти до создания %1", hc.countObjects(classnum(DictTable)))); dictTable = new DictTable(0); if (dictTable == null) info("Проверка на NULL вернула истину"); info (strfmt("Кол-во объектов в памяти после создания %1", hc.countObjects(classnum(DictTable)))); hc.firstUnfreedObject(); while (hc.moreUnfreedObjects()) { if (hc.unfreedObjectClass() == classStr(DictTable)) { info(strfmt("Кол-во ссылок на класс %1", hc.unfreedObjectUseCount())); } hc.nextUnfreedObject(); } dictTable2 = dictTable; hc.firstUnfreedObject(); while (hc.moreUnfreedObjects()) { if (hc.unfreedObjectClass() == classStr(DictTable)) { info(strfmt("Кол-во ссылок на класс %1", hc.unfreedObjectUseCount())); } hc.nextUnfreedObject(); } dictTable = null; info (strfmt("Кол-во объектов в памяти после присвоения NULL %1", hc.countObjects(classnum(DictTable)))); dictTable2 = null; info (strfmt("Кол-во объектов в памяти после присвоения NULL %1", hc.countObjects(classnum(DictTable)))); }
__________________
Axapta v.3.0 sp5 kr2 |
|
![]() |
#2 |
Участник
|
На сайте Эхо Москвы есть передача Суть событий
В заставке Сергей Пархоменко говорит: "Я обещал вам объяснить суть событий? Объясняю. По пятницам после 9 вечера"... Объясняю: Все зависит от реализации java-машины. ((dictTable == null) == true) вовсе не означает, что dictTable физически содержит 0. Такая проверка дает ответ на вопрос "ссылается ли данная переменная на класс или нет". И ничего больше. Причем уточняю: "на экземпляр (instance) класса". В данном случае обе переменные dictTable и dictTable не ссылаются на какой-то конкретный экземпляр. Но реализация может быть такова, что они физически все же ссылаются в какое-то место памяти. И еще раз напомню: не забывай о том, что память в java-машинах освобождается не сразу, а только после работы сборщика мусора. См. ФАКи по java... Это Java, а не С ![]() |
|
![]() |
#3 |
Участник
|
Цитата:
Сообщение от mazzy
![]() В данном случае обе переменные dictTable и dictTable не ссылаются на какой-то конкретный экземпляр. Но реализация может быть такова, что они физически все же ссылаются в какое-то место памяти.
И еще раз напомню: не забывай о том, что память в java-машинах освобождается не сразу, а только после работы сборщика мусора. См. ФАКи по java... Это Java, а не С ![]() Кстати, ни одни сборщик мусора не удалит объект в памяти, на который есть ссылки. Ради эксперимента вставил в класс Info код по созданию "пустого" DictTable и добавил метод по его удалению (явному присвоению NULL). После рестарта ссылка на объект оставлась до тех пор, пока не вызвал метод по удалению В общем, как такой объект ни называй, память он занимает, пока явно не будет присвоен null или не выйдет из области видимости
__________________
Axapta v.3.0 sp5 kr2 |
|
![]() |
#4 |
Участник
|
Цитата:
объект в java занимает память пока не будет вызван его деструктор. Да, в java есть деструкторы. Просто конкретная реализация под названием X++ не позволяет вызвать деструктор явно (или я не знаю такого способа). В java деструкторы вызываются в основном сборщиком мусора. Вручную деструкторы вызываются очень редко (как раз в подобных случаях, когда конструктору не удалось создать объект) Чтобы заглубляться в вопрос дальше, лучше рыть в сторону java-документации и java-форумов. |
|
Теги |
ax3.0, ax4.0 |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|