我有一个 java 应用程序,它似乎从 OS 分配了越来越多的内存(但堆大小根本没有增长!)它是一个与 PLC 通信的应用程序,因此它需要相当多的 CPU。
为了测试porpuse,我编写了这个程序,以确保问题不在某些库中:
public static void main(String[] args) {
Random rand= new Random();
if (args[0].equals("auto")) {
for(int i = 0; i< Integer.valueOf(args[2]);i++) {
new Thread(new Runnable() {
@Override
public void run() {
List<byte[]> threaddata = new ArrayList<>();
while(true) {
byte[] arr = new byte[Integer.valueOf(args[3])];
rand.nextBytes(arr);
threaddata.add(arr);
Thread.sleep(Long.valueOf(args[1]));
threaddata.clear();
Thread.sleep(Long.valueOf(args[1]));
}
}
}).start();
}
}
我已经像这样启动了应用程序
java -XX:NativeMemoryTracking=detail -Xmx1G -XX:+UseG1GC -XX:G1PeriodicGCInterval=10000 -XX:G1HeapWastePercent=10 -jar gctest.jar auto 100 3 10000000
这意味着应用程序在 3 个线程中每 100 毫秒分配和释放 10MB。
现在我遇到了Native Memory Tracking
它给了我这个输出Internal
- Internal (reserved=367356KB, committed=367356KB)
(malloc=367324KB #3131147)
(mmap: reserved=32KB, committed=32KB)
一开始它需要大约15MB
现在它几乎400MB
我刚看到这个文档,但它对我一点帮助都没有。有什么线索可以防止java从操作系统分配越来越多的内存吗?
编辑:我分配和释放内存的速度越快,操作系统中的内存增长得越快