История изменений
Исправление KivApple, (текущая версия) :
Отличия от управляемых языков тут два:
1) Память в Си освобождается небольшими блоками по мере необходимости, как правило. GC же спит, а потом в один прекрасный момент начинает освобождать сразу много блоков памяти, которые успели накопиться пока он спал. В итоге то что размазано по всему времени работы программы в Си, собирается в один момент времени на Java и получаются тормоза. Поясню: если программа работает на 5% медленнее, ты это никогда не заметишь. А если она работает нормально, но раз в несколько секунд работает в 10 раз медленнее, это будет сильно раздражать.
2) В Си память освобождается как только перестаёт быть нужной. В Java - только когда сработает GC. В итоге при интенсивной работе с ней, в Java много времени будет висеть память, которая ожидает освобождения, а новые блоки будут выделяться из кучи, а не из этой памяти. В итоге объём потребления памяти возрастает, потому что ОС не важно нужные ли данные в ОЗУ - она всё равно занята, пока приложение не сообщит об обратном. Аналогия: если мыть посуду сразу после еды, то количество грязной посуды будет минимально (по сути дела это будет лишь та посуда, из которой едят прямо сейчас). А если мыть посуду массово, но только каждую пятницу, то количество грязной посуды будет сильно больше (при одинаковом потреблении каждый день - в 7 раз). Более того - не все смогут себе такое позволить, потому что чистая посуда может и кончится в середине недели.
А также особенность, которая не связанна прямо с управлением памятью - в Java насаждается концепция «всё есть объект» (даже числа) и в JVM помимо основной программы работает куча других вещей - JIT, например. В итоге накладные расходы по памяти растут.
Исправление KivApple, :
Отличия от управляемых языков тут два:
1) Память в Си освобождается небольшими блоками по мере необходимости, как правило. GC же спит, а потом в один прекрасный момент начинает освобождать сразу много блоков памяти, которые успели накопиться пока он спал. В итоге то что размазано по всему времени работы программы в Си, собирается в один момент времени на Java и получаются тормоза. Поясню: если программа работает на 5% медленнее, ты это никогда не заметишь. А если она работает нормально, но раз в несколько секунд работает в 10 раз медленнее, это будет сильно раздражать.
2) В Си память освобождается как только перестаёт быть нужной. В Java - только когда сработает GC. В итоге при интенсивной работе с ней, в Java много времени будет висеть память, которая ожидает освобождения, а новые блоки будут выделяться из кучи, а не из этой памяти. В итоге объём потребления памяти возрастает, потому что ОС не важно нужные ли данные в ОЗУ - она всё равно занята, пока приложение не сообщит об обратном. Аналогия: если мыть посуду сразу после еды, то количество грязной посуды будет минимально (по сути дела это будет лишь та посуда, из которой едят прямо сейчас). А если мыть посуду массово, но только каждую пятницу, то количество грязной посуды будет побольше. Более того - не все смогут себе такое позволить, потому что чистая посуда может и кончится в середине недели.
А также особенность, которая не связанна прямо с управлением памятью - в Java насаждается концепция «всё есть объект» (даже числа) и в JVM помимо основной программы работает куча других вещей - JIT, например. В итоге накладные расходы по памяти растут.
Исправление KivApple, :
Отличия от управляемых языков тут два:
1) Память в Си освобождается небольшими блоками по мере необходимости, как правило. GC же спит, а потом в один прекрасный момент начинает освобождать сразу много блоков памяти, которые успели накопиться пока он спал. В итоге то что размазано по всему времени работы программы в Си, собирается в один момент времени на Java и получаются тормоза. Поясню: если программа работает на 5% медленнее, ты это никогда не заметишь. А если она работает нормально, но раз в несколько секунд работает в 10 раз медленнее, это будет сильно раздражать.
2) В Си память освобождается как только перестаёт быть нужной. В Java - только когда сработает GC. В итоге при интенсивной работе с ней, в Java много времени будет висеть память, которая ожидает освобождения, а новые блоки будут выделяться из кучи, а не из этой памяти. В итоге объём потребления памяти возрастает, потому что ОС не важно нужные ли данные в ОЗУ - она всё равно занята, пока приложение не сообщит об обратном. Аналогия: если мыть посуду сразу после еды, то количество грязной посуды (посуды, из которой уже поели, но ещё не помыли) будет нулевым в любом момент времени. А если мыть посуду массово, но только каждую пятницу, то количество грязной посуды будет побольше. Более того - не все смогут себе такое позволить, потому что чистая посуда может и кончится в середине недели.
А также особенность, которая не связанна прямо с управлением памятью - в Java насаждается концепция «всё есть объект» (даже числа) и в JVM помимо основной программы работает куча других вещей - JIT, например. В итоге накладные расходы по памяти растут.
Исправление KivApple, :
Отличия от управляемых языков тут два:
1) Память в Си освобождается небольшими блоками по мере необходимости, как правило. GC же спит, а потом в один прекрасный момент начинает освобождать сразу много блоков памяти, которые успели накопиться пока он спал. В итоге то что размазано по всему времени работы программы в Си, собирается в один момент времени на Java и получаются тормоза. Поясню: если программа работает на 5% медленнее, ты это никогда не заметишь. А если она работает нормально, но раз в несколько секунд работает в 10 раз медленнее, это будет сильно раздражать.
2) В Си память освобождается как только перестаёт быть нужной. В Java - только когда сработает GC. В итоге при интенсивной работе с ней, в Java много времени будет висеть память, которая ожидает освобождения, а новые блоки будут выделяться из кучи, а не из этой памяти. В итоге объём потребления памяти возрастает, потому что ОС не важно нужные ли данные в ОЗУ - она всё равно занята, пока приложение не сообщит об обратном.
А также особенность, которая не связанна прямо с управлением памятью - в Java насаждается концепция «всё есть объект» (даже числа) и в JVM помимо основной программы работает куча других вещей - JIT, например. В итоге накладные расходы по памяти растут.
Исходная версия KivApple, :
Отличия от управляемых языков тут два:
1) Память в Си освобождается небольшими блоками по мере необходимости, как правило. GC же спит, а потом в один прекрасный момент начинает освобождать сразу много блоков памяти, которые успели накопиться пока он спал. В итоге то что размазано по всему времени работы программы в Си, собирается в один момент времени на Java и получаются тормоза.
2) В Си память освобождается как только перестаёт быть нужной. В Java - только когда сработает GC. В итоге при интенсивной работе с ней, в Java много времени будет висеть память, которая ожидает освобождения, а новые блоки будут выделяться из кучи, а не из этой памяти. В итоге объём потребления памяти возрастает, потому что ОС не важно нужные ли данные в ОЗУ - она всё равно занята, пока приложение не сообщит об обратном.
А также особенность, которая не связанна прямо с управлением памятью - в Java насаждается концепция «всё есть объект» (даже числа) и в JVM помимо основной программы работает куча других вещей - JIT, например. В итоге накладные расходы по памяти растут.