之前排查問題有涉及到一些jvm的知識,之前提到的是一些基礎的gc日志知識,這次接着簡單分析jvm的設計原理,相信jvm的設計方法會對我們在項目設計時有些啟發。
1 什么是Perm Generation?
持久存儲的jvm使用的class對象,class對象,就像其他存儲在堆中的對象一樣。class對象也和object對象一樣被存儲和gc。class對象和其他對象的關系如圖。
2 為什么要把object對象和class對象分開存儲?
1) 哲學原因:在軟件哲學上看,class對象是jvm需要的,object對象是應用開發需要的,分開存儲,應用開發就不需要關心jvm的那些對象。
2) 歷史原因:在自定義class loader[3]沒有流行的時代,通過觀察發現class對象很少被unload,因此獨立存儲會減少掃描對象,提高gc的性能。
3) 目前技術原因:目前Perm Gen存在主要是並行回收器回收時需要按照對象被移動的先后順序處理,因為處理一個對象時需要找到對象對應的class信息,而Perm Gen是先於tenured區移動的,這使得處理對象時能夠准確找到對應class對象的位置。
3 永久區中有什么?
- 類的方法(字節碼...)
- 類名(Sring對象)
- .class文件讀到的常量信息
- class對象相關的對象列表和類型列表 (e.g., 方法對象的array).
- JVM創建的內部對象
- JIT編譯器優化用的信息
4 參考&延伸閱讀:
1) 什么是Permanent Gen:https://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation
2) 各種收集器:https://blogs.oracle.com/jonthecollector/entry/our_collectors
3) ClassLoader簡介:http://www.javaworld.com/article/2077260/learn-java/the-basics-of-java-class-loaders.html