以前排查問題有涉及到一些jvm的知識,以前提到的是一些基礎的gc日誌知識,此次接着簡單分析jvm的設計原理,相信jvm的設計方法會對咱們在項目設計時有些啓發。html
1 什麼是Perm Generation?java
持久存儲的jvm使用的class對象,class對象,就像其餘存儲在堆中的對象同樣。class對象也和object對象同樣被存儲和gc。class對象和其餘對象的關係如圖。oracle
2 爲何要把object對象和class對象分開存儲?jvm
1) 哲學緣由:在軟件哲學上看,class對象是jvm須要的,object對象是應用開發須要的,分開存儲,應用開發就不須要關心jvm的那些對象。性能
2) 歷史緣由:在自定義class loader[3]沒有流行的時代,經過觀察發現class對象不多被unload,所以獨立存儲會減小掃描對象,提升gc的性能。優化
3) 目前技術緣由:目前Perm Gen存在主要是並行回收器回收時須要按照對象被移動的前後順序處理,由於處理一個對象時須要找到對象對應的class信息,而Perm Gen是先於tenured區移動的,這使得處理對象時可以準確找到對應class對象的位置。spa
3 永久區中有什麼?設計
4 參考&延伸閱讀:日誌
1) 什麼是Permanent Gen:https://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generationhtm
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