[英]Java JNA wrapper and memory consumption
我有一個疑問,帶有JNA包裝器的JVM進程如何顯示內存消耗。
例如,我運行使用OpenCV JNA包裝器的Java應用程序。 Java應用程序本身消耗例如1GB的RAM,而OpenCV本機庫消耗3GB的RAM。 所以總的來說,當我找到合適的Java JVM進程(通過ps
命令)時,它將顯示1GB的RAM或4GB(1 + 3)的RAM?
您的ps
輸出將顯示1GB的RSS(“駐留集大小-分配給該進程並在RAM中的內存量”。)Java進程不會直接顯示已用的本機內存; 但是,它將顯示為VSZ的一部分(虛擬內存大小-進程可以訪問的所有內存,包括換出的內存,已分配但未使用的內存以及來自共享庫的內存。)
例如,我編寫了以下代碼:
import com.sun.jna.Memory;
public class TinyJavaBigC {
public static void main(String[] args) {
// Grab 1 GiB of memory
Memory buf = new Memory(1 << 30);
// Sleep long enough to grab ps
}
}
不管使用new Memory(bytes)
保留了多少本機內存(有效調用malloc
),Java應用程序始終在RSS中使用相同數量的內存,並且使用-Xmx
限制Java堆大小並不會阻止超出此范圍的本機內存分配限制。 但是,本機內存的1 GiB顯然已從操作系統的“可用”內存中消失了。
我將上面的代碼放在循環中以增加左移值以進行分配,並使用-Xmx512m
對其進行了-Xmx512m
,該-Xmx512m
應將JVM堆限制為512 MiB。 RSS(包括所有JVM堆棧和堆內存)保持在大約50 MiB范圍內。 分配的內存確實顯示在與該進程關聯的VSZ
中。 由於這還包括其他類型的內存,因此這不是直接的衡量標准,並且大大超出了可用RAM和交換文件大小的限制,但至少確實表明了分配增加的跡象。
Native Memory RSS VSZ
1 byte 42.0 MiB 9.6 GiB
2 bytes 45.8 MiB 9.6 GiB
4 bytes 46.0 MiB 9.6 GiB
8 bytes 46.1 MiB 9.6 GiB
16 bytes 46.3 MiB 9.6 GiB
32 bytes 46.5 MiB 9.6 GiB
64 bytes 47.0 MiB 9.6 GiB
128 bytes 47.5 MiB 9.6 GiB
256 bytes 47.6 MiB 9.6 GiB
512 bytes 48.9 MiB 9.6 GiB
1 KiB 49.1 MiB 9.6 GiB
2 KiB 49.2 MiB 9.6 GiB
4 KiB 49.3 MiB 9.6 GiB
8 KiB 49.3 MiB 9.6 GiB
16 KiB 49.8 MiB 9.6 GiB
32 KiB 50.1 MiB 9.6 GiB
64 KiB 50.1 MiB 9.6 GiB
128 KiB 50.6 MiB 9.6 GiB
256 KiB 51.4 MiB 9.6 GiB
512 KiB 51.3 MiB 9.6 GiB
1 MiB 51.4 MiB 9.6 GiB
2 MiB 51.4 MiB 9.6 GiB
4 MiB 51.4 MiB 9.6 GiB
8 MiB 51.4 MiB 9.6 GiB
16 MiB 51.3 MiB 9.7 GiB
32 MiB 51.3 MiB 9.7 GiB
64 MiB 51.7 MiB 9.8 GiB
128 MiB 51.7 MiB 9.9 GiB
256 MiB 51.6 MiB 10.1 GiB
512 MiB 51.6 MiB 10.5 GiB
1 GiB 51.7 MiB 11.3 GiB
2 GiB 51.8 MiB 12.8 GiB
4 GiB 51.9 MiB 15.8 GiB
8 GiB 51.9 MiB 21.8 GiB
16 GiB 52.0 MiB 33.8 GiB
32 GiB 52.0 MiB 57.8 GiB
64 GiB 52.1 MiB 105.8 GiB
128 GiB 52.1 MiB 201.8 GiB
256 GiB 52.5 MiB 393.8 GiB
512 GiB 52.6 MiB 777.8 GiB
1 TiB 52.7 MiB 1.5 TiB
2 TiB 52.7 MiB 3.0 TiB
4 TiB 52.8 MiB 6.0 TiB
8 TiB 52.9 MiB 12.0 TiB
16 TiB 53.1 MiB 24.0 TiB
32 TiB 53.2 MiB 48.0 TiB
Exception in thread "main" java.lang.OutOfMemoryError: Cannot allocate 70368744177664 bytes
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.