Информация об изменениях

Сообщение Re[6]: Причины популярности java от 23.05.2022 16:30

Изменено 23.05.2022 16:35 vsb

Re[6]: Причины популярности java
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, vsb, Вы писали:


НС>>>Серьезно?

vsb>>Я про стандартную библиотеку.

НС>А это не стандартная


JNA? нет, не стандартная.

vsb>>>>Ещё есть забавный прикол. Для mmap в жаве есть интерфейсы. Но закрыть MappedByteBuffer невозможно.

НС>>>sun.nio.ch.DirectBuffer.cleaner()?
vsb>>Тогда уж sun.misc.Unsafe#invokeCleaner

НС>Это хак через рефлекшен. А вот то что я привел — вполне себе публичный АПИ.


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


        var path = Path.of("/Users/vbezhenar/Downloads/ticket.pdf");
        var fileChannel = FileChannel.open(path);
        var mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size());

        var b0 = mappedByteBuffer.get(0);
        System.out.println(b0);

        var theUnsafeField = Unsafe.class.getDeclaredField("theUnsafe");
        theUnsafeField.setAccessible(true);
        var unsafe = (Unsafe) theUnsafeField.get(null);
        
        unsafe.invokeCleaner(mappedByteBuffer);

        var b1 = mappedByteBuffer.get(1);
        System.out.println(b1);


vsb>> но этот способ в будущих ждк отрубят, и сейчас по-моему надо специальные флаги прописывать, чтобы оно работало. С "невозможно" написал некорректно, невозможно сделать "правильно", без хаков.


НС>Ну так вроде тебе сказали почему. Хотя вот в дотнете сделать у MMF Dispose это не помешало.


А я ответил, что это плохая реализаия, т.к. валит всю виртуальную машину при попытке обращения к отмапленной памяти. Разыменование null-а не валит, например.
Re[6]: Причины популярности java
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, vsb, Вы писали:


НС>>>Серьезно?

vsb>>Я про стандартную библиотеку.

НС>А это не стандартная


JNA? нет, не стандартная.

vsb>>>>Ещё есть забавный прикол. Для mmap в жаве есть интерфейсы. Но закрыть MappedByteBuffer невозможно.

НС>>>sun.nio.ch.DirectBuffer.cleaner()?
vsb>>Тогда уж sun.misc.Unsafe#invokeCleaner

НС>Это хак через рефлекшен. А вот то что я привел — вполне себе публичный АПИ.


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

        var path = Path.of("/Users/user/Downloads/ticket.pdf");
        var fileChannel = FileChannel.open(path);
        var mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size());

        var b0 = mappedByteBuffer.get(0);
        System.out.println(b0);

        var theUnsafeField = Unsafe.class.getDeclaredField("theUnsafe");
        theUnsafeField.setAccessible(true);
        var unsafe = (Unsafe) theUnsafeField.get(null);
        
        unsafe.invokeCleaner(mappedByteBuffer);

        var b1 = mappedByteBuffer.get(1);
        System.out.println(b1);


vsb>> но этот способ в будущих ждк отрубят, и сейчас по-моему надо специальные флаги прописывать, чтобы оно работало. С "невозможно" написал некорректно, невозможно сделать "правильно", без хаков.


НС>Ну так вроде тебе сказали почему. Хотя вот в дотнете сделать у MMF Dispose это не помешало.


А я ответил, что это плохая реализаия, т.к. валит всю виртуальную машину при попытке обращения к отмапленной памяти. Разыменование null-а не валит, например.