Я написал библиотеку на C, которая потребляет много памяти (миллионы маленьких блоков). Я написал программу c, которая использует эту библиотеку. И я написал Java-программу, которая использует ту же библиотеку. Программа на Java представляет собой очень тонкий слой вокруг библиотеки. По сути, есть только один собственный метод, который вызывается, выполняет всю работу и возвращает часы спустя. Дальнейшая связь между Java и нативной библиотекой с использованием интерфейса вызова Java отсутствует. Также нет объектов Java, которые занимают значительное количество памяти.
Таким образом, c-программа и Java-программа очень похожи. Все вычисления / распределение памяти происходит внутри собственной библиотеки. Еще. При выполнении программа c потребляет 3 ГБ памяти. Но программа Java потребляет 4,3 ГБ! (Сумма VIRT указана сверху)
Я проверил карту памяти процесса Java (используя pmap). Только 40 МБ используются библиотеками. Поэтому дополнительные библиотеки, загружаемые Java, не являются причиной.
У кого-нибудь есть объяснение этому поведению?
РЕДАКТИРОВАТЬ : Спасибо за ответы до сих пор. Чтобы сделать его немного более понятным: код Java ничего не делает, кроме как вызывает собственную библиотеку ONCE ! Куча Java имеет стандартный размер (возможно, 60 МБ) и не используется (за исключением одного класса, содержащего метод main, а другого класса, вызывающего собственную библиотеку).
Метод нативной библиотеки является долгосрочным и выполняет много malloc и освобождает. Фрагментация - это одно из объяснений, о которых я тоже думал. Но поскольку Java-код не активен, поведение фрагментации должно быть одинаковым для Java-программы и c-программы. Поскольку он отличается, я также предполагаю, что используемые реализации malloc отличаются при запуске в программе на языке c или в программе на Java.