3

我有一个 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从操作系统分配越来越多的内存吗?

编辑:我分配和释放内存的速度越快,操作系统中的内存增长得越快

4

1 回答 1

2

我跑了你的片段。

这是它在 VisualVM 中的外观(JDK 11,标准设置):

在此处输入图像描述

我在任务管理器(Windows)中检查了资源使用情况。它是恒定的。

所以,我检查了Linux。必须安装htop和升级 JDK,但我认为那里没有区别。这是htop运行程序 5 分钟左右后的输出。VIRT 和 RES 值保持不变,总内存消耗保持相似。

在此处输入图像描述

又过了 5 分钟。Res改成了119M,不过我觉得没什么好担心的。

在此处输入图像描述

从本机内存跟踪,间隔 5 分钟:

[root@Ukyo 130 /download]# while sleep 300; do jcmd 16920 VM.native_memory |grep Internal -A 3; done
               Internal (reserved=605KB, committed=605KB)
                        (malloc=565KB #1151)
                        (mmap: reserved=40KB, committed=40KB)

               Internal (reserved=605KB, committed=605KB)
                        (malloc=565KB #1151)
                        (mmap: reserved=40KB, committed=40KB)
于 2019-05-28T08:53:31.437 回答