Ответы пользователя по тегу JVM
  • Почему не выпускают процессоры на архитектуре виртуальной машины Java?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Ну... это противоречит идее Java. Платформа ведь создавалась чтобы быть общим знаменателем для десятков аппаратных платформ для встраиваемой бытовой техники. Такая была идея по крайней мере.

    И практика платформ показала что поменять софт в 1000 раз дешевле чем поменять оборудование.

    UPD: Вот вики описывает 6 попыток реализовать Java-процессор в железе
    https://en.wikipedia.org/wiki/Java_processor (3 исследовательских и 3 коммерческих продукта)
    надо читать и разбираться что они сделали.
    В каком статусе? Используется щас или нет?
    Ответ написан
    4 комментария
  • Как при сборки мусора и перемещении объекта, сохраняется корректность ссылок?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Нету никаких указателей. Указатели - это терминология С++.

    Да GC обладает правом двигать объекты в памяти. Но это тебя не должно волновать.
    Ты работаешь в прарадигме managed memory.

    Тость НИКАКОЙ АДРЕСНОЙ арифметики ты не имеешь права использовать.
    Используй ссылки объекты и все будет норм.
    Ответ написан
    6 комментариев
  • Как Jit Компиляторы обнаружат недостижимой код и лишние проверки?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Как Jit Компиляторы обнаружат недостижимой код и лишние проверки?

    Если мне не изменяет память, JIT компиллятор компилирует java-метод целиком. Переводя byte-code в машинный код для x86 например.

    А то что спрашивает автор - это задача основного компиллятора который язык Java переводит в байткод.

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

    ли Космические Лучи, в Ram попали, что тогда будет?

    Программисты 20-го века работали в условиях глючной памяти (когда были ЭВМ на лампах и на тразнисторах)
    и обрабатывали специальное прерывание типа "глюк в ячейке памяти".

    С точки зрения современной парадигмы разработки - это невозможно. Никакой прикладной
    программист не ставит себе задачу отслеживания целостности памяти. Это как-бы не его
    уровень. Мы предполагаем что память надежна и всегда корректна. А иначе ОС выпадает
    в синий экран и никаких принятий решения мы все равно не сделаем а облачные балансировщики
    примут свои решения когда хост выпадет из сети.

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

    Рассматривать такие случаи в топике Java - бесполезно и контр-продуктивно. Давайте
    их рассматривать в топиках инфо-беза и операционок.
    Ответ написан
    Комментировать
  • Кушает ли память логирование?

    mayton2019
    @mayton2019 Куратор тега Java
    Bigdata Engineer
    Java медленно потребляет память даже в состоянии покоя. Видимо системные треды что-то аллоцируют. Я как-то создавал пустое main приложение которое стоит на паузе и на графике JVisualVM я наблюдал медленный рост Eden space. Попробуй тоже такой эксперимент.

    Вообще тебя это не должно беспокоить. Это нормальный цикл работы управляемой памяти. Главное что в тот
    момент когда срабатывает System.gc память быстро очищается без переноса объектов в Survival.

    Сам процесс логгирования тоже можно писать оптимально или не оптимально. Покажи исходники и хабр посмотрит что там можно улучшить. Здесь разные логгеры log4j, log4-2 могут использовать разные механики для оптимизации.
    Ответ написан
    1 комментарий
  • "прикладной код Java" - это что?

    mayton2019
    @mayton2019 Куратор тега Java
    Bigdata Engineer
    В тексте вопроса написано много чепухи. Java может использовать внешнюю память. Кажется еще
    в Java 8 для Apache Ignite (и других NoSQL систем) были попытки использовать неуправлямую
    память через ByteBuffer. История где-то об этом сохранилась я думаю.

    Начиная с JDK-14 (могу ошибаться) завезли Foreign Memory API который оперирует с памятью
    более продвинуто.

    По поводу
    в Java не надо следить за памятью

    - неправда. Следить за памятью надо всегда. Иногда это делает разработчик (для С/C++)
    а иногда это делает GC или умные механизмы borrow-checker (Rust).
    Если не следить то долго работающие процессы пожирают всю память ОС
    до тех пор пока не будут убиты через ОС OOM killer. Возможно под слежением
    имелись в виду накладные расходы на работу GC? Но эта проблема специфична
    только для приложений которые активно делают new и переживают хотя-бы одну
    эпоху. Кроме того в Java есть несколько разных GC которые просто обнуляют
    все тезисы например 2000х годов и обсуждать их надо уже совсем как другие
    алгоритмы которые имеют другие свойства. Грубо говоря знания по GC очень
    сильно устарели после G1, Shennandoh e.t.c. Нужно учить заново всё.

    прикладной код Java - заменить на “прикладной код движка Java”

    Это вообще невозможно прокомментировать т.к. идет жонглирование терминами без
    определений. Что такое движок в данном случае - непонятно?

    В любом случае тебе надо звать в студию этого загадочного Романа и не плодить свои домыслы.
    Ответ написан
    2 комментария
  • Как удалить ненужные версии JDK?

    mayton2019
    @mayton2019 Куратор тега Java
    Bigdata Engineer
    Не знаю откуда вы сформировали такой отчет.

    С точки зрения современной ОС вы можете хранить много конфигураций JDK/JRE и перключаться между ними просто изменяя PATH/CLASSPATH. Это работает для Linux в основном. Для Windows мне это не удавалось. По крайней мере был еще один способ конфигурирования путей доступа к библиотекам который я на тот момент не знал. Возможно через реестр.

    Чтобы удалить ненужный - нужно знать какие вам нужны. Я-бы оставил только 17 поскольку она LTS (Long Term Support) а все остальные бы удалил если нет других требований.

    Из оставшихся двух версия corretto - разрабатывается и поставляется амазоном на его виртуалки. Поэтому если хостинг покупаете в амазоне то имеет смыл и ее использовать. Но я не вижу JDK это или JRE. Для процесса разработки софта (компилляции) нужна только JDK.
    Ответ написан
    2 комментария
  • Какой смысл команды dup в JVM байт коде? И что за индексы локальных переменных?

    mayton2019
    @mayton2019 Куратор тега Java
    Bigdata Engineer
    Какой смысл команды dup в JVM байт коде?

    Жаль что ты не программировал на калькуляторе МК 60. Это целая эпоха.

    Значит есть разные пути к вычислению арифметики. Например если тебе надо возвести в квадрат число 5 на регистровой машине - то ты должен загрузить регистр R1 числом. Потом регистр R2. И потом найти такую команду умножения которая свяжет регистры R1 и R2 и перемножит и сохранит еще где-то результат. В силу современного зоопарка процессоров практически нереально создать такой абстрактный байткод который бы эффективно отображался на опкоды разных железяк. Поэтому решили забить на регистровую машину. И использовать стек как хранилище операндов для операций. Разумеется в JVM есть и аналоги регистров но с ними не выполняются операции. ЕМНИП. Если хошь что-то сложить или вызвать функцию - то положи на стек и там-же получи результат. И если вернуться к возведению числа 5 в квадрат это может быть так

    положить 5 на стек.
    дублировать
    вызвать функцию умножения


    На каком-нибудь языке Forth это было-бы тремя командами
    5 DUP * .
    Результат - на вершине стека.

    Это кратко записывается. Но это несет абсолютно ту-же смысловую нагрузку для арифметики.

    Почему их только 256 может быть?

    А чорт его знает. Так решили. Решили что 256 регистров это капец какой максимум для процедуры или функции. Послушай ради интереса видосы про процессор Эльбрус. Там тоже интересно с регистрами сделано.

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

    Я думаю что твое предположение о том какой код соберет JIT не совсем верное.
    Вместо спора я предлагаю взять какой-то тестовый сценарий и подсмотреть какой
    будет собран код. Я знаю что скептики Java обычно после изучения вопроса глубже
    меняют свою точку зрения. Ну по крайней мере перестают считать Java
    "медленным покемоном". Java действительно была слоупоком во времена Jdk 1.1.
    Но щас это не так.

    Несколько лет назад я мерял производительность floating-point вычислений на приложении
    которое рендерит зеркальные шары. И разница между С++ и Java была не сильно большая.
    10 секунд на сях и 12 секунд на втором языке соотв. Хотя этот тест узкий и он просто
    показывает частный случай.
    Ответ написан
    4 комментария
  • Реальная ли в jvm многопоточность?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Проверить это можно так. Запускаем jvm-процесс который создает 1000 потоков но не сразу а постепенно. Смотрим в linux top процессов и если количество процессов (потоков) растет то мы получаем доказательство того что jvm-theread линейно связан с числом linux-processes (threads).

    В windows ЕМНИП один процесс включает в себя от 1 до бесконечности вычислительных потоков.
    В linux процесс и поток отличаются опциями разделения ресурсов. Тоесть что по сути опциями безопасности. Например потоки шарят разделяемую память а процессы - не шарят никогда.
    Ответ написан
    Комментировать
  • Почему StringBuilder.setLength(0) медленнее чем ожидается?

    mayton2019
    @mayton2019 Куратор тега Java
    Bigdata Engineer
    А как вы измеряли? Методика бенчмарков в Java - нетривиальна. Тут надо попасть в прогретый код и в промежутки между паузами GC. Иначе ваш эскперимент будет выдавать вовсе не то время что вы хотите мерять.
    Ответ написан
    4 комментария