Мы поставляем Java-приложения, которые работают на Linux, AIX и HP-Ux (PA-RISC). Похоже, мы изо всех сил пытаемся получить приемлемый уровень производительности в HP-Ux от приложений, которые прекрасно работают в двух других средах. Это относится как к времени выполнения, так и к потреблению памяти.
Хотя мне еще предстоит найти определенную статью о «почему», я считаю, что измерение потребления памяти с помощью «top» является грубым подходом из-за таких вещей, как общий код, дающий вводящие в заблуждение результаты. Тем не менее, это все, что нам нужно сделать на сайте заказчика, где потребление памяти в HP-Ux стало проблемой. Это стало проблемой только в этот раз, когда мы перешли с Java 1.4 на Java 1.5 (на HP-Ux 11.23 PA-RISC). Под «проблемой» я подразумеваю, что машина перестала создавать новые процессы, потому что мы исчерпали все 16 ГБ физической памяти.
Измеряя «до» и «после» общей «свободной памяти», мы пытаемся измерить, сколько было использовано Java-приложением. Я написал быстрое приложение, которое хранит 10 000 случайных 64-битных строк в ArrayList, и попробовал этот подход для измерения потребления в Linux и HP-Ux в Java 1.4 и Java 1.5.
Результаты:
HP Java 1,4 ~ 60 МБ
HP Java 1,5 ~ 150 МБ
Linux Java 1.4 ~ 24MB
Linux Java 1.5 ~ 16MB
Может кто-нибудь объяснить, почему могут возникнуть эти результаты? Это какая-то особенность способа, которым «верх» измеряет свободную память? Действительно ли Java 1.5 на HP потребляет в 2,5 раза больше памяти, чем Java 1.4?
Спасибо.