Ho scritto una libreria in C che consuma molta memoria (milioni di piccoli blocchi). Ho scritto un programma c che utilizza questa libreria. E ho scritto un programma java che usa la stessa libreria. Il programma Java è uno strato molto sottile attorno alla libreria. Fondamentalmente c'è un solo metodo nativo che viene chiamato, fa tutto il lavoro e ritorna ore dopo. Non c'è ulteriore comunicazione tra Java e la libreria nativa usando l'interfaccia di invocazione java. Né ci sono oggetti Java che consumano una notevole quantità di memoria.Perché una libreria nativa usa una quantità di memoria 1,5 volte superiore quando viene usata da java come quando viene usata da un C-Programm sotto linux?
Quindi il programma c e il programma Java sono molto simili. L'intera assegnazione di calcolo/memoriale avviene all'interno della libreria nativa. Ancora. Quando viene eseguito, il programma c consuma 3 GB di memoria. Ma il programma Java consuma 4,3 GB! (Importo VIRT riportato in alto)
Ho controllato la mappa di memoria del processo Java (utilizzando pmap). Solo 40 MB sono utilizzati dalle biblioteche. Quindi le librerie aggiuntive caricate da Java non sono la causa.
Qualcuno ha una spiegazione per questo comportamento?
MODIFICA: Grazie per le risposte finora. Per renderlo un po 'più chiaro: il codice java non fa altro che invocare la libreria nativa ONCE! L'heap java è di dimensioni standard (forse 60 MB) e non viene utilizzato (ad eccezione di una classe contenente il metodo main e l'altra classe che richiama la libreria nativa).
Il metodo di libreria nativa è di lunga durata e esegue molti mallocs e liberi. La frammentazione è una spiegazione che ho pensato anche a me stesso. Ma poiché non esiste un codice Java attivo, il comportamento della frammentazione dovrebbe essere lo stesso per il programma Java e il programma c. Dal momento che è diverso presumo anche che le implementazioni di malloc utilizzate siano diverse quando vengono eseguite in programma c o in programma Java.
Osservazione intrestante. Non mi sarei aspettato questo comportamento. – x4u
frammentazione di heap malloc. Vedi http://stackoverflow.com/a/28935176/166062 –
@LariHotari Mentre il motivo di questa domanda era diverso (vedi la mia risposta), abbiamo avuto anche problemi con la frammentazione. L'abbiamo risolto passando a implementazioni alternative come tcmalloc, jemalloc o l'implementazione di malloc da locklessinc. –