Jvm дизайнерское решение

Почему для jvm требуется около 10 МБ памяти для простого мира привет, но clr этого не делает. Что такое компромисс здесь, т.е. Что делает выигрыш jvm, делая это?

Позвольте мне пояснить немного, потому что я не передаю вопрос, который у меня в голове. Очевидно, что существует разница в архитектуре между временем работы jvm и clr. Jvm имеет значительно больший объем памяти, чем clr. Я предполагаю, что есть какая-то польза от этих накладных расходов, иначе почему бы это существовать. Я спрашиваю, какие компромиссы в этих двух проектах. Какая польза от jvm выигрывает от его накладных расходов памяти?

Ответы

Ответ 1

Я предполагаю, что одна из причин заключается в том, что Java должна делать все сама по себе (еще один аспект независимости платформы). Например, Swing привлекает свои собственные компоненты с нуля, он не полагается на ОС для их рисования. Все это должно было произойти в памяти. Много вещей, которые могут делать окна, но linux не должен (или по-другому) полностью содержаться в Java, так что он работает одинаково на обоих.

Java также всегда настаивает на том, что вся библиотека "Linked" и доступна. Поскольку он не использует DLL (они не будут доступны на каждой платформе), все должно быть загружено и отслеживаться с помощью java.

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

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

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

В обоих случаях этот минимальный объем памяти не был проблемой - там были конкретные проблемы Java, которые просто не были такими. Количество экземпляров объектов и скорость рисования Swing были большими проблемами в этих случаях.

Ответ 2

Кажется, что java просто использует больше виртуальной памяти.

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
amwise   20598  0.0  0.5  22052  5624 pts/3    Sl+  14:59   0:00 mono Test.exe
amwise   20601  0.0  0.7 214312  7284 pts/2    Sl+  15:00   0:00 java Program

Я сделал тестовую программу на С# и на Java, которая печатает строку "test" и ждет ввода. Я считаю, что значение размера резидентного размера (RSS) более точно показывает использование памяти. Использование виртуальной памяти (VSZ) менее значимо.

Как я понимаю, приложения могут резервировать тонну виртуальной памяти, фактически не используя какую-либо реальную память. Например, вы можете запросить функцию VirtualAlloc в Windows для резервирования или фиксации виртуальной памяти.

EDIT:

Вот красивая картинка из окна моего окна: alt text http://awise.us/images/mem.png

Каждое приложение было простым printf, а затем getchar. Много использования виртуальной памяти Java и CLR. Версия C зависит практически от нуля, поэтому использование памяти относительно незначительно.

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

EDIT:

Этот инструмент VMMap от Microsoft может быть полезен при определении того, где происходит память.

Ответ 3

Я не знаю, важна ли начальная память или область приложения Hello World. Разница может быть связана с количеством и размерами библиотек, загружаемых JVM/CLR. Также может быть объем памяти, который предварительно распределен для пулов сбора мусора.

Каждое приложение, которое я знаю, использует намного больше, чем функциональность Hello World. Это будет загружать и освобождать память тысячи раз на протяжении всего выполнения приложения. Если вас интересуют различия в использовании памяти JVM vs CLR, вот несколько ссылок с хорошей информацией.

http://benpryor.com/blog/2006/05/04/jvm-vs-clr-memory-allocation/

Пример управления памятью (JVM и CLR)

Исследование использования памяти в Power Point. Очень интересная презентация.

Ответ 4

JVM подсчитывает все свои общие библиотеки независимо от того, использует ли они память или нет.

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

Ответ 5

JVM загружает множество ненужных базовых классов для каждого запуска из rt.jar. К сожалению, внутренние взаимозависимости (java.lang ↔ java.io) java-пакетов затрудняют выполнение частичного запуска init. Не говоря уже о том, что rt.jar сам по себе превышает 40 МБ, требуется много времени для поиска и распаковки.

Post Java 6u10, кажется, загружает вещи немного умнее (у него есть служба быстрого запуска jqs.exe = java для хранения необходимых данных в памяти и более быстрого запуска), но, как говорят, Java 7 лучше.

Проводник процессов в Windows правильно описывает частные байты (частные байты - это те области памяти, которые не разделяются никакими DLL).

Немного большая досада заключается в том, что через 10 лет JVM по-прежнему по умолчанию использует память 64 МБ. На самом деле очень сложно использовать -Xmx почти каждый раз и не может запускать требуемые программы в банках с помощью простого двойного щелчка (если я не изменю команду назначения расширения файла).

Ответ 6

CLR подсчитывается как часть ОС, поэтому диспетчер задач не сообщает о потреблении памяти в процессе приложения.