LINUX.ORG.RU

[дикость] delete в Java


0

2

Из года в год читаю здесь о пожирании явой памяти. А почему никто до сих пор не запилил ключевое слово delete в Java, дабы можно было руками чистить память в обход GC? Это устранило бы «жручесть» Java, но оставило все плюшки: не хочешь думать о памяти - не используй delete. Кроме того, т.к. Java - managed, проблемы с delete, присущие C++, легко устраняются. Например, проблема с использованием уже удалённого участка памяти: при первом же обращении к удалённому участку можно выдать исключение с полным описанием проблемы, что, где и почему (вплоть до строки кода).

★★★
Ответ на: комментарий от svu

> Тогда просто проникнитесь тем, что гс с поддержкой делете принципиально сильно тормознее гс без поддержки делете.

Покопаю сырцы, покручу, в процессе буду проникаться.

Sadler ★★★
() автор топика

Ты вообще хотя бы отдаленно представляешь себе, как работает GC в Java? Что такое generations знаешь? Память выделяется только в первом поколении - а удалять ты, скорее всего, будешь уже в следующем.

anonymous
()
Ответ на: комментарий от sendel

> полный прогон GC не так сильно нагружает систему как почему то Вы показываете

Если бы все было так ужасно, то java не была бы встроена ни в java-карты,


Лоровская школота во всём своём великолепии! ))

LamerOk ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

> чувак, если уж на крестах это делать начал, возьзи буст и не выноси мозкЪ.

Ненавижу boost.

Sadler ★★★
() автор топика
Ответ на: комментарий от Boy_from_Jungle

>не гони плиз, тебя за это убьют

Ну, я как обычно, начал отвечать по мере прочтения, а не перечитав всю тему, так что человеку альтернативу деструктору предложил :)

KRoN73 ★★★★★
()
Ответ на: комментарий от Sadler

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

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от KRoN73

тот метод нельзя использовать, если тебе нужно убирать, то нужно так

Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
	
System.out.println("Goodbye men");
// your delete method

}
});

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от Boy_from_Jungle

>тот метод нельзя использовать

А почему, кстати? Лет пять назад использовал много. И в весьма нагруженных больших проектах. Мимо каких граблей я проскочил? :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>Мимо каких граблей я проскочил? :)

Во время шатдавна вма их могут не вызвать.

r ★★★★★
()
Ответ на: комментарий от Sadler

Почитай про модель памяти явы, же. И затем подумай, можешь подумать про safe сей операции, когда ссылки еще есть, а объекта уже нет.

_________

//wfrr

anonymous
()
Ответ на: комментарий от KRoN73

вызов finalize никто не гарантирует 8)

хотя его чатсо юзают для проверки «почистили ли все ресурсы наши тупые программисты», в jndi емнип даже стектерйс записывается и выбрасывается в finalize если не закрыл что-то.

_________

//wfrr

anonymous
()
Ответ на: комментарий от anonymous

>вызов finalize никто не гарантирует 8)

Я про это читал в те времена. Но многочисленные эксперименты показали, что в нашем проекте finalize() вызывался всегда. При чём использовался очень интенсивно в итоге, при параллельной загрузке, и на нём освобождение памяти висело. Память не текла :)

KRoN73 ★★★★★
()
Ответ на: комментарий от Sadler

Пример. Я обрабатываю поток высококачественных изображений, несколько изображений в секунду. Очевидное решение - подгружать их с HDD в объект, из которого извлекать и парсить матрицу пикселей. Но при этом программа начинает жрать пару ГБ оперативы, ибо GC не справляется.

Не умеешь - не пиши.

hint: preallocated buffers.

mv ★★★★★
()
Ответ на: комментарий от mv

> hint: preallocated buffers.

Я буду читать тред перед своим постом. Я буду читать тред перед своим постом. Я буду читать тред перед своим постом. Я буду читать чёртов тред перед своим постом. Я буду читать тред перед тем, как постить. Я буду читать тред... Я, чёрт возьми, прочитаю тред, прежде чем постить то, на что 4 раза уже ответили!

Sadler ★★★
() автор топика
Ответ на: комментарий от KRoN73

>на нём освобождение памяти висело

Этого в принципе достаточно чтобы его не сипользовать, ежели я прально помню то если объект проберется из eden, то там при некоторых алгоритмах сборки проиходит остановка выполнения на время сборки мусора, и у вас эта сборка сильноо затягивалась, а все приложение стояло...

_________

//wfrr

anonymous
()
Ответ на: комментарий от Sadler

Думай хотя бы один раз, прежде чем писать стрёмный код, а потом жаловаться на форуме, что яйца мешают.

mv ★★★★★
()
Ответ на: комментарий от anonymous

>и у вас эта сборка сильноо затягивалась, а все приложение стояло...

Чистейшей воды реалтайм на многие сотни активных клиентов и десятки тысяч активных объектов :) (MMORPG сервер)

finalize использовался где-то (достоверно уже не помню) в очистках кешей взаимной видимости объектов. Идёт игрок или NPC, постоянно сменяет регионы-сектора на местности, при смене региона происходит переучёт новых объектов, которые могут попасть в поле зрения и сброс старых. При сбросе старых нужно чистить статические кеши. Вот finalize этим и занимался. Утечек точно не было, тормозов — тоже :)

KRoN73 ★★★★★
()
Ответ на: комментарий от anonymous

> Ему помочь хотят, а он огрызается.

Помочь? Зачем? Я этот код не писал, а если бы стал писать, написал бы иначе. Неужели вы действительно считаете, что я такой дурак, что не додумаюсь использовать буфер? Одни советчики в треде, который совсем не о том участке кода, а о концепции.

Sadler ★★★
() автор топика
Ответ на: комментарий от Sadler

Я его не писал.

Тогда тем более плакать о левых вещах не надо. Аллокатор даже в сишечке стараются не дёргать, чтобы пул не покрошить.

mv ★★★★★
()
Ответ на: комментарий от KRoN73

finalize использовался где-то (достоверно уже не помню) в очистках кешей взаимной видимости объектов.

Для сего есть weakreference и ReferenceQueue, без костылей буде.

тормозов — тоже :)

Цытирую классиков:

При чём использовался очень интенсивно в итоге, при параллельной загрузке, и на нём освобождение памяти висело.

_________

//wfrr

anonymous
()
Ответ на: комментарий от svu

500 лет как есть такая возможность - вставлять инструкции jvm. Название либы не припомню, увы, но мы ее активно использовали.

anonymous
()
Ответ на: комментарий от anonymous

Это все-таки не стандарт. И это не асм.

svu ★★★★★
()

Например, объекты, локальные для метода, удаляются очень быстро и безболезненно.
Прогонять через яву гигабайты данных можно, но это не эффективно. Для этого существует jni, который многие кроссплатформенные проекты также используют.

Оператор принудительного освобождения всей памяти, занятой конкретным объектом, мог бы пригодиться на мобильных платформах.

note173 ★★★★★
()
Ответ на: комментарий от KRoN73

к сожалению, в конечном итоге фраза сокращается до

оптимизация — зло :)


и мы имеем программы по функционалу на 95 год, а по потребляемым ресурсам — на 2012.

Ingwar ★★★★★
()
Ответ на: комментарий от mv

> Аллокатор даже в сишечке стараются не дёргать, чтобы пул не покрошить.

Это если аллоктор херовый. Или ты предлагаешь каждому Sadler'у свои преаллокейтед буферы плодить? Думаешь, сильно лучше получится?

anonymous
()
Ответ на: комментарий от anonymous

Это если аллоктор херовый.

Как будто много где он нехеровый есть. Я вот с полгода назад пока 34 маллока в коде одного товарища на статические буферы не поменял, программуля для uC/OS-II гибла через некоторое время.

Или ты предлагаешь каждому Sadler'у свои преаллокейтед буферы плодить? Думаешь, сильно лучше получится?

Для обработки видео-то? Ещё деды завещали буферы выделять заранее.

mv ★★★★★
()
Ответ на: комментарий от mv

> Как будто много где он нехеровый есть.

Ну дак а зачем гамном, в котором аллокатор херовый, пользоваться?

с полгода назад пока 34 маллока в коде одного товарища на статические буферы не поменял, программуля для uC/OS-II гибла через некоторое время.

и отчего же она гибла?

Для обработки видео-то? Ещё деды завещали буферы выделять заранее.

Тред не читал, признаю.. Для видео действительно лучше заранее выделить аллокатором :) А вот для мелочи свои унутряной аллокатор плодить - нет пути.

anonymous
()
Ответ на: комментарий от Boy_from_Jungle

>те же кресты, тем более работа с памятью там описана только в хидерах

(ностальгически) А когда ЛОР был торт и модератором был К48, то за «хидеры» ведь могли и забанить...

V_L_A_D ★★
()
Ответ на: комментарий от Boy_from_Jungle

> Да забыл написать WeakReference то что тебе нужно.

Читайте тред перед своим постом.

Sadler ★★★
() автор топика
Ответ на: комментарий от stevejobs

> блджад, указатели в жаве и накрайняк JNI для кого придумали? Люди для тебя писали, старались.

И вы читайте тред перед своим постом. Я уже устал повторять, что тот код был приведён в качестве примера и ко мне отношения не имеет.

Sadler ★★★
() автор топика
Ответ на: комментарий от Sadler

топик тоже за тебя кто-то написал? ;) Если хочешь ручное управление объектами - пиши на си и подключай, будет delete и чо хочешь, а ручное управление памятью в жаве и так есть.

stevejobs ★★★★☆
()
Ответ на: комментарий от Ingwar

>и мы имеем программы по функционалу на 95 год

2,5D игры, короткие куски 8-битного звука, разрешение 320x200x256@60 или 640x480x16@60, новейшая операционная система, которая грузится минуту-две на топовых машинах и в которой запуск более-менее тяжеловесной программы занимает минуту и т.п.? :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>2,5D игры, короткие куски 8-битного звука, разрешение 320x200x256@60 или 640x480x16@60, новейшая операционная система, которая грузится минуту-две на топовых машинах и в которой запуск более-менее тяжеловесной программы занимает минуту и т.п.? :)


нет, например QuarkXpress 95-96 года вполне заменит суперсовременный Adobe Indesign CS5, а в 7 фотошопе я сделаю допечатку по фоткам не хуже, чем в том же PS CS5.

320x200x256@60


95? думаю это 90-91.

Я ничего не имею против прогресса. Но определенная операционка, которая только за последние 8 лет выросла в 10 раз на винчестере — это слабоватый прогресс. И так практически все проприетарное программное обеспечение — функциональность растет на 50 процентов, ресурсов гробится на 500.

Ingwar ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.