1. 程式人生 > >類元數據Class Metadata

類元數據Class Metadata

span 它的 使用 mit 可能 div 提高 ffffff ext

Java classes在Java hotspot VM內部表示為類元數據。 在之前Java hotspot VM版本,類元數據在持久代中分配。 在JDK8,持久代被移除,並且類元數據在本地內存中分配。 默認情況下,本地內存都可以被用於類元數據。 可以使用MaxMetaspaceSize 選項設置在本地內存允許設置的最大類元數據。 Java hotspot VM顯示的管理元數據空間。 OS請求空間,然後分成分片,類加載器分配元數據空間從分片中,當類沒有被加載器加載時,它的分片交被回收以備OS重新使用。 元數據使用由mmap分配的空間,而不是由malloc分配的。 如果UseCompressedOopsUseCompressedClassesPointers 選項同時被使用,那麽兩種邏輯不同的本地內存區域會處理類元數據。
當類被卸載時,類元數據將被釋放。由於垃圾回收而被卸載的Java classes,垃圾回收會卸載並釋放類元數據。 當類元數據達到一定水平時,會引起垃圾回收。在垃圾回收後,可以根據類元數據釋放的空間量來確定是升高high-water mark還是降低high-water mark。如果升高high-water mark可能會引起垃圾回收。high-water mark最初設置為MetaspaceSize選項的值。 根據MaxMetaspaceFreeRatioMinMetaspaceFreeRatio兩個選項決定high-water mark的提高還是降低。 如果已經分配的類元數據空間占比大於MaxMetaspaceFreeRatio的值,則high-water mark將降低。
如果已經分配的類元數據空間占比小於MinMetaspaceFreeRatio的值,high-water mark將提升。 可以為MetaspaceSize 選擇指定更高的值,以避免對類元數據的過早垃圾回收。 為應用程序分配多少類元數據空間取決於應用程序,沒有一個通用標準。 Heap PSYoungGen total 10752K, used 4419K [0xffffffff6ac00000, 0xffffffff6b800000, 0xffffffff6b800000) eden space 9216K, 47% used [0xffffffff6ac00000,0xffffffff6b050d68,0xffffffff6b500000) from space 1536K, 0% used [0xffffffff6b680000,0xffffffff6b680000,0xffffffff6b800000) to space 1536K, 0% used [0xffffffff6b500000,0xffffffff6b500000,0xffffffff6b680000) ParOldGen total 20480K, used 20011K [0xffffffff69800000, 0xffffffff6ac00000, 0xffffffff6ac00000) object space 20480K, 97% used [0xffffffff69800000,0xffffffff6ab8add8,0xffffffff6ac00000) Metaspace used 2425K, capacity 4498K, committed 4864K, reserved 1056768K class space used 262K, capacity 386K, committed 512K, reserved 1048576K
used為加載類使用的空間 capacity為可當前分片中可用的元數據空間 committed為可用的分片數量 reserved為元數據保留的空間數量

類元數據Class Metadata