【问题标题】:How to get from Java YoungGen and OldGen?如何从 Java Young Gen 和 Old Gen 中获取?
【发布时间】:2022-01-17 14:33:01
【问题描述】:

如何从Java中获取以下YoungGen(Eden、Survivor0、Survivor1)、OldGen区域的分配和空闲内存的值?

我看到tomcat页面显示了这个信息,请问如何从java代码中获取?

关于maxMemory()totalMemory()freeMemory(),我知道,但并不完全清楚如何准确地获取内存区域的值,例如Tomcat。

【问题讨论】:

    标签: java memory memory-management garbage-collection heap-memory


    【解决方案1】:

    您可以使用the Management API,尤其是MemoryMXBean

    例如

    import java.lang.management.*;
    
    class Memory {
        public static void main(String[] args) {
            MemoryMXBean m = ManagementFactory.getMemoryMXBean();
            for(MemoryType type: MemoryType.values()) {
                usage(type, type == MemoryType.HEAP?
                    m.getHeapMemoryUsage(): m.getNonHeapMemoryUsage());
                System.out.println();
                for(MemoryPoolMXBean mp: ManagementFactory.getMemoryPoolMXBeans())
                    if(mp.getType() == type) usage(mp.getName(), mp.getUsage());
                System.out.println();
            }
        }
      
        private static void usage(Object header, MemoryUsage mu) {
            long used = mu.getUsed(), max = mu.getMax();
            System.out.printf(
                max > 0? "%-30s %,d (%,d MiB) of %,d (%,d MiB)%n": "%-30s %,d (%,d MiB)%n",
                header, used, used >>> 20, max, max >>> 20);
        }
    }
    

    Demo on Ideone

    Heap memory                    2,820,696 (2 MiB) of 1,037,959,168 (989 MiB)
    
    Tenured Gen                    0 (0 MiB) of 715,849,728 (682 MiB)
    Eden Space                     4,231,056 (4 MiB) of 286,326,784 (273 MiB)
    Survivor Space                 0 (0 MiB) of 35,782,656 (34 MiB)
    
    Non-heap memory                2,833,312 (2 MiB) of 352,321,536 (336 MiB)
    
    CodeHeap 'non-nmethods'        1,079,040 (1 MiB) of 5,828,608 (5 MiB)
    Metaspace                      1,078,264 (1 MiB) of 67,108,864 (64 MiB)
    CodeHeap 'profiled nmethods'   489,472 (0 MiB) of 122,912,768 (117 MiB)
    Compressed Class Space         114,560 (0 MiB) of 33,554,432 (32 MiB)
    CodeHeap 'non-profiled nmethods' 89,856 (0 MiB) of 122,916,864 (117 MiB)
    

    请参阅this answer,了解如何获取有关垃圾回收及其结果的通知的示例。

    【讨论】:

    • 霍尔格,哇,非常感谢!
    猜你喜欢
    • 2019-04-18
    • 2016-01-06
    • 2011-08-21
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 2021-02-25
    • 2022-12-08
    • 1970-01-01
    相关资源
    最近更新 更多