Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8306841

Generational ZGC: NMT reports Java heap size larger than max heap size



    • Bug
    • Resolution: Fixed
    • P4
    • 21
    • None
    • hotspot
    • gc
    • b26


      ZGC has separated the committing of physical memory from the mapping of the committed memory to virtual memory. It also has asynchronous, lazy unmapping of virtual memory from physical memory. This leads to a situation where multiple virtual memory areas can be mapped to the same physical memory. NMT has a strong assumption that there's a 1-to-1 correspondence between committed memory and its virtual memory areas. Because of this NMT and ZGC is not entirely compatible. ZGC has worked around this by adding NMT hooks where the virtual memory is mapped to the committed memory. This mostly works, but there are situations where we have multiple virtual memory areas mapped to the same physical memory, and that causes the NMT values to be inflated.

      I propose that we move the NMT committed memory tracking from the mapping of virtual memory to the actual committing of physical memory.

      FWIW, given that NMT and ZGC doesn't agree about how memory is committed, we have to fake the virtual memory addresses reported to NMT. This could probably be noticed if you look for the Java heap addresses in the NMT details output, but I don't see why anyone should be looking for those address for the Java heap in NMT. The interesting number is the amount of committed memory, not the exact addresses, IMHO. This isn't something that we change with this patch, but it can be worth understanding while looking at this Bug and the associated PR.


        Issue Links



              stefank Stefan Karlsson
              stefank Stefan Karlsson
              0 Vote for this issue
              6 Start watching this issue