LINUX.ORG.RU

почему надо/не надо заботиться о памяти при программировании под VM?

 


1

1

Интересно было бы узнать. Для начала процитирую morse

Нет, не актуально. Большинство программистов сейчас пишут под виртуальные машины, и с памятью напрямую почти не общаются.

дискасс

★★☆☆☆

О ресурсах нужно заботиться тогда, когда их не хватает.

Преждевременная оптимизация — корень всех бед.

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

ну тут скорее вопрос в том, что якобы VM освобождает (делает бесполезными) все заботы о памяти.

dikiy ★★☆☆☆
() автор топика

На сколько я понял morse имел в виду разработку на java, c#, js и других языках которые выполняются в виртуальной машине и не дают программисту работать с памятью

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

Это не имеет значения.

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

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

ок. берем что-то потяжелее, там где это действительно имеет значение. И запускаем в VM и вне VM. Вопрос, оптимизации по памяти дадут что-то при запуске в VM по сравнению с запуском вне VM?

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

Лучше скажи как ты вообще видишь себе оптимизацию памяти не имея к ней прямого доступа.

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

В лучае с VM типа или xen, все таки памяти напрямую отображатся в физическую, не?

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

Ты бы сначала выяснил для себя, что такое «программирование под VM».

вот сейчас и выясним.

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

ничего страшного. Лишние знания не помешают.

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

Лучше скажи как ты вообще видишь себе оптимизацию памяти не имея к ней прямого доступа.

если подумать, то у прикладных процессов внутри ВМ, выполняющихся на той же архитектуре, что и хост, доступ к памяти принципиально не отличается от выполнения на хосте. Я про всякие VirtualBox-ы с kvm-ами, с аппаратной поддержкой виртуализации и всё такое.

С эмуляцией, скажем x86 на ARM и наоборот могут быть нюансы

Harald ★★★★★
()

О какого рода оптимизациях речь? Если у тебя там в VM тебе не дают аллоцировать / освобождать, не факт что тебе не придется другие оптимизации применять, например исключать лишние копирования, объединять объекты, делать объекты больше / меньше и тп. А еще мож придется в кишки VM залезть (но это уже другая история, хотя бывает что там есть ручки, за которые можно дергать). А мож у тебя полно ненужных одноразовых объектов в памяти, которые просто трешат её без нужды. А может ты поджираешь пару гигов и потом копируешь их в цикле непрестанно, а всё потому, что надо пару типов данных в объекте поменять, и всё станет хорошо. Очень сильно всё зависит от ситуации...

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

Мне объяснить, какой смысл вкладывал ТС в слова «виртуальная машина» (VM), когда задавал вопрос.

tailgunner ★★★★★
()

Ну ты и Мать Тереза.
Некий деятель, страдающий наслаждающийся непогрешимостью, вместе с начальным постом снёс и целую ветку, где обсуждалось, почему это так/нетак. Вряд-ли отписавшиеся там захотят повторяться здесь. (На score нормальным людям плевать, но сам процесс получения уведомлений, что твоё сообщение снесли «за компанию», довольно неприятен.)

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

Если ты просто пользуешься виртуальной памятью, то на прикладном уровне без разницы. Тебе так же должен беспокоить кэш, размер объектов, alignment, структуры данных. То есть пихаешь то, что используется вместе - рядом, что раздельно - отдельно, чтобы проц за данными по всей памяти не скакал. valgrind/kcachegrind хорошо всё находит. Не вижу причин такие оптимизации не делать на ЯВУ если тормозит и надо быстрее.

slapin ★★★★★
()
Ответ на: комментарий от i-rinat

Угадай, зачем это нужно?

Чтобы получить проблем вместе со сменой джава машины или даже просто с апдейтом оной до новой версии?

Это мое предположение, на самом деле я абсолютно без понятия.

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

С точки зрения оригинального вопроса - нет. Тут речь скорее про скриптоту, java, js и подобное, у которого VM есть. А по поводу ЯВУ C++ или нет на самом деле полно в сети срачиков и получается зависит от задач. Да и пофиг.

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

Не, вряд ли тут приедут проблемы кроме общих проблем java приходящих с апгрейдом (смена API).

Очень много пишут всякой низкоуровневой фигни на java, даже генераторы нативных инструкций с последующим их запуском. Это вот болезнь такая. Но к такому я отношусь с пониманием - если знаешь только один язык и сросся с ним за годы, очень сложно на другой переходить под задачу, да и желания нет. Сидел такой программер на теплом месте, писал бизнес-логику а тут к нему с оптимизациями. Казалось бы, надо быстро - напиши jniшку, всё будет зашибись, не, мы пойдём другим путем, будем писать фреймворк, который будет генерить код на asm'е строго под amd64 (x86_64), будем дергать на нем ассемблер, делать .so и грузить это .so как jni и выполнять. А на арме не работает, пишите сами...

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

Чтобы получить проблем вместе со сменой джава машины или даже просто с апдейтом оной до новой версии?

И каких там проблем можно получить?

i-rinat ★★★★★
()
Ответ на: комментарий от slapin

Очень много пишут всякой низкоуровневой фигни на java

Ага, чтобы потом стыковать это с высокоуровневым кодом на Java. Проблема с JNI состоит в том, что с JIT-компиляцией такой код не очень хорошо дружит. Будет маленький эффективный код на сях, все преимущества которого сожрёт стыковка с JVM.

даже генераторы нативных инструкций с последующим их запуском

Это были фантазии, а затем, кажется, извращения Стиви.

i-rinat ★★★★★
()
Ответ на: комментарий от morse

Начнём с того, что «прямое обращение и взаимодейстиве с памятью» уже тыщу лет как в общем случае не возможно.

Времена DOS, Amiga, Atari, Z80 и других CP/M давно прошли. В общем случае на прямую с памятью никто давно не взаимодействует.

Linux — это тоже (хитрож*пая) витруальная машина.

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

А что ты называешь прямым взаимодействием с памятью? Виртуальная память реализована аппаратно.

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

Ну я как бы к тому и клоню, что есть «прямое взаимодействие» с памятью?

По дороге туда у нас несколько баррикад абстракций, начиная с железа, os и других vm с runtime-мами.

Что же хотел узнать автор?

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

Это типа авторам дали почувствовать себя ковбоями? Именно JNI на ассемблере, причём генерируемый во время работы? Сомнительная польза.

i-rinat ★★★★★
()
Ответ на: комментарий от drsm

Да. Чтобы разные ядра не воевали за одну кеш-линию при обновлениях. Говорят, отлично помогает.

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

sun.misc.Unsafe — приватное api. Его уже однажды грозились выпилить, и вроде как даже приступили к сему с десятой версии. В ibm j9 оно работает, судя по всему, хреново, а значит переехав, например, с openjdk на j9 запросто можно себе что-нибудь придавить. Название unsafe какбе намекает. Не надо его использовать.

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

Времена DOS, Amiga, Atari, Z80 и других CP/M давно прошли. В общем случае на прямую с памятью никто давно не взаимодействует.

А что такое «напрямую» в твоем понимании? Вот Rowhammer, который сбрасывает биты DRAM - это «напрямую» или нет?

tailgunner ★★★★★
()

Да ё-моё, третий тред про одну и ту же глупость?

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

Лучше скажи как ты вообще видишь себе оптимизацию памяти не имея к ней прямого доступа.

ну тоже смотря что понимать под. haspMap vs treeMap считается?

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

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

Это разве не пример плохой практики? Через какое-то время код из этой программы понадобится повторно использовать в более сложном контексте, запускать неоднократно. А то, что он «одноразовый», либо забудится, либо использовать его будет другой человек, не имеющий отношения к изначальной разработке. И получится нежданчик. Не проще ли с самого начала не писать говнокод, и явно освобождать все явно выделенные ресурсы?

seiken ★★★★★
()
Ответ на: комментарий от i-rinat

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

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

Ну такие вещи редко рассматриваются как критерий при разработке. Важно что есть здесь и сейчас, а потом будет потом.

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

В общем случае на прямую с памятью никто давно не взаимодействует.

Тут либо «в общем случае», либо «никто». Если система конфигурируется статически на этапе разработки, все устройства В/В определены заранее и не меняются, так же как и пиковая нагрузка - зачем такой системе виртуальная память? Другое дело, что и динамического выделения ресурсов в такой системе нет.

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

Ой, расскажи это тем кто лоулэйтенси(хотя бы сотни микросекунд отклика) пишет на java и c#. Они оценят твой тонкий солдатский юморок.

И там и там в общем можно, хотя местами и практологическими методами. Может и в js можно, но тут я не в курсе.

pon4ik ★★★★★
()

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

Бессмысленный вопрос, бессмысленный ответ morse.

anonymous
()

Звучит как бред - если память узкое место, то никакая виртуалка этого не исправит, а скорее - усугубит.

Звучит как правда - больше 90%(субъективно) разработчиков не заморачивается производительностью на таком низком уровне, т.к. память превращается в узкое место начиная с того момента когда твоя атомарная бизнес операция должна занимать меньше половины миллисекунды(условно, эта величина ежедневно уменьшается), согласно нефункциональным требованиям. А большинство разработки - web и интернет, там другие времена откликов, на порядки и десятки порядков выше.

pon4ik ★★★★★
()
Последнее исправление: pon4ik (всего исправлений: 1)
Ответ на: комментарий от Rastafarra

ну тоже смотря что понимать под. haspMap vs treeMap считается?

Не, это структуры данных, они имеют мало отношения к физической памяти.

morse ★★★★★
()

при освобождении памяти можно выйти за границы массива, поэтому нужно использовать безопасные языки и не думать о таких мелочах: java, rust, go и тд. Си - позапрошлый век, или когда там динозавры съели все листья и вымерли...

rust_afari
()

Что значит заботиться о памяти?

Не разбазаривать - да, нужно.

Не писать тупые алгоритмы - да, нужно.

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

Очень точно считать потребление памяти - тоже, только если нужно. Обычно нет и более того, невозможно нормально посчитать

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

Вот знаешь, многие программы сейчас работают так, что задумываешься о том, что хорошо бы было разработчиков пересадить на какой-нибудь P4 с 512 МБ памяти. Ну, по праздникам за примерное поведение выдавать ещё планку на 256.

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

отдавать предпочтения примитивным типам, вместо их объектных оберток, минимизировать число используемых объектов, не плодить их копии, использовать структуры на основе массивов например ArrayList вместо LinkedList.

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