JAVA8永久代

????在Java虛擬機(以下簡稱JVM)中,類包含其對應的元數據,比如類的層級信息,方法數據和方法信息(如字節碼,棧和變量大小),運行時常量池,已確定的符號引用和虛方法表。

???在過去(當自定義類加載器使用不普遍的時候),類幾乎是“靜態的”并且很少被卸載和回收,因此類也可以被看成“永久的”。另外由于類作為JVM實現的一部分,它們不由程序來創建,因為它們也被認為是“非堆”的內存。

???在JDK8之前的HotSpot虛擬機中,類的這些“永久的”數據存放在一個叫做永久代的區域。永久代一段連續的內存空間,我們在JVM啟動之前可以通過設置-XX:MaxPermSize的值來控制永久代的大小,32位機器默認的永久代的大小為64M,64位的機器則為85M。永久代的垃圾回收和老年代的垃圾回收是綁定的,一旦其中一個區域被占滿,這兩個區都要進行垃圾回收。但是有一個明顯的問題,由于我們可以通過?XX:MaxPermSize 設置永久代的大小,一旦類的元數據超過了設定的大小,程序就會耗盡內存,并出現內存溢出錯誤(OOM)。

備注:在JDK7之前的HotSpot虛擬機中,納入字符串常量池的字符串被存儲在永久代中,因此導致了一系列的性能問題和內存溢出錯誤。

???隨著Java8的到來,我們再也見不到永久代了。但是這并不意味著類的元數據信息也消失了。這些數據被移到了一個與堆不相連的本地內存區域,這個區域就是我們要提到的元空間。這項改動是很有必要的,因為對永久代進行調優是很困難的。永久代中的元數據可能會隨著每一次Full GC發生而進行移動。并且為永久代設置空間大小也是很難確定的,因為這其中有很多影響因素,比如類的總數,常量池的大小和方法數量等。

???同時,HotSpot虛擬機的每種類型的垃圾回收器都需要特殊處理永久代中的元數據。將元數據從永久代剝離出來,不僅實現了對元空間的無縫管理,還可以簡化Full GC以及對以后的并發隔離類元數據等方面進行優化。

移除永久代的影響

????由于類的元數據分配在本地內存中,元空間的最大可分配空間就是系統可用內存空間。因此,我們就不會遇到永久代存在時的內存溢出錯誤,也不會出現泄漏的數據移到交換區這樣的事情。最終用戶可以為元空間設置一個可用空間最大值,如果不進行設置,JVM會自動根據類的元數據大小動態增加元空間的容量。

注意:永久代的移除并不代表自定義的類加載器泄露問題就解決了。因此,你還必須監控你的內存消耗情況,因為一旦發生泄漏,會占用你的大量本地內存,并且還可能導致交換區交換更加糟糕。

元空間內存管理

????元空間的內存管理由元空間虛擬機來完成。先前,對于類的元數據我們需要不同的垃圾回收器進行處理,現在只需要執行元空間虛擬機的C++代碼即可完成。在元空間中,類和其元數據的生命周期和其對應的類加載器是相同的。話句話說,只要類加載器存活,其加載的類的元數據也是存活的,因而不會被回收掉。

????我們從行文到現在提到的元空間稍微有點不嚴謹。準確的來說,每一個類加載器的存儲區域都稱作一個元空間,所有的元空間合在一起就是我們一直說的元空間。當一個類加載器被垃圾回收器標記為不再存活,其對應的元空間會被回收。在元空間的回收過程中沒有重定位和壓縮等操作。但是元空間內的元數據會進行掃描來確定Java引用。

????元空間虛擬機負責元空間的分配,其采用的形式為組塊分配。組塊的大小因類加載器的類型而異。在元空間虛擬機中存在一個全局的空閑組塊列表。當一個類加載器需要組塊時,它就會從這個全局的組塊列表中獲取并維持一個自己的組塊列表。當一個類加載器不再存活,那么其持有的組塊將會被釋放,并返回給全局組塊列表。類加載器持有的組塊又會被分成多個塊,每一個塊存儲一個單元的元信息。組塊中的塊是線性分配(指針碰撞分配形式)。組塊分配自內存映射區域。這些全局的虛擬內存映射區域以鏈表形式連接,一旦某個虛擬內存映射區域清空,這部分內存就會返回給操作系統。

參考如下鏈接:http://www.infoq.com/cn/articles/Java-PERMGEN-Removed?from=groupmessage&isappinstalled=0

轉載于:https://www.cnblogs.com/moonandstar08/p/5001914.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256352.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256352.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256352.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Struts 2初體驗

Struts2簡介: Struts2是一個基于MVC設計模式的Web應用框架,它本質上相當于一個servlet,在MVC設計模式中,Struts2作為控制器(Controller)來建立模型與視圖的數據交互。 Struts 2 目錄結構:     apps目錄:Struts2示例…

機器學習——深度學習之數據庫和自編碼器

目錄 一、數據庫——數據獲取 1、Mnist 2、ImageNet 二、自編碼器(Auto-encoder)——參數初始化 1、功能 2、基本思想 1)訓練第一層 2)訓練第二層及以后的神經網絡 ? 3)利用BP對整個神經網絡的參數初始值進…

Halcon例程詳解 (深度圖轉換為3D圖像)—— xyz_attrib_to_object_model_3d

一、前言 深度圖向點云圖進行轉換是進行3D檢測項目時會遇到的問題,halcon里也有針對此問題的相關例程,下面對此例程進行分析。通過學習此例程,我們可以掌握如何將一張深度圖像和一張正常二維圖像轉換為3D點云。 二、分析 * 初始化界面 dev…

動態代理之Cglib淺析

什么是Cglib Cglib是一個強大的,高性能,高質量的代碼生成類庫。它可以在運行期擴展JAVA類與實現JAVA接口。其底層實現是通過ASM字節碼處理框架來轉換字節碼并生成新的類。大部分功能實際上是ASM所提供的,Cglib只是封裝了ASM,簡化了…

機器學習——深度學習之卷積神經網絡(CNN)——AlexNet卷積神經網絡結構

目錄 一、AlexNet卷積神經網絡結構模型 1、數據庫ImageNet 2、AlexNet第一層卷積層 二、AlexNet卷積神經網絡的改進 1、非線性變化函數的改變——ReLU 2、最大池化(Max Pooling)概念的提出——卷積神經網絡通用 1)池化層 2&#xff0…

POJ - 3470 Walls

小鳥往四個方向飛都枚舉一下,數據范圍沒給,離散以后按在其中一個軸線排序,在線段樹上更新墻的id,然后就是點查詢在在哪個墻上了。 這題有個trick,因為數據范圍沒給我老以為是inf設置小了,WA了很多發。&…

C# —— 深入理解委托類型

一. 委托定義 1. 委托與多播委托 委托類型表示對具有特定參數列表和返回類型的方法的引用,定義了委托實例可以調用的某類方法。 通過委托,我們可以動態的通過委托變量來調用委托方法。一般用delegate來命名委托類型,但Action和Func也可以達到同樣的效果…

【VS開發】【C++語言】reshuffle的容器實現算法random_shuffle()的使用

假設你需要指定范圍內的隨機數,傳統的方法是使用ANSI C的函數random(),然后格式化結果以便結果是落在指定的范圍內。但是,使用這個方法至少有兩個缺點。首先,做格式化時,結果常常是扭曲的,所以得不到正確的隨機數&…

C#委托——基礎2

在上一篇隨筆中,簡要說明了怎樣定義委托,定義事件,訂閱事件,最后也實現了效果,就是當員工類的某個對象,執行某個事件時,委托事件被觸發,后面也得到了結果,但是想象一下實…

機器學習——深度學習之編程工具、流行網絡結構、卷積神經網絡結構的應用

目錄 一、編程工具 caffe實現LENET-5 二、流行的網絡結構 1、VGGNET 2、Googlenet ? 3、ResNet? ? 三、卷積神經網絡的應用 1、人臉識別 ? 2、人臉驗證 3、人臉特征點檢測 4、卷積神經網絡壓縮 一、編程工具 caffe的優點:模型標準化,源代碼…

Halcon例程詳解(激光三角系統標定)—— calibrate_sheet_of_light_calplate.hdev

前言 1 激光三角測距 激光三角測距法原理很簡單,是通過一束激光以一定的入射角度照射被測目標,激光在目標表面會產生漫反射,在另一角度利用透鏡對反射激光匯聚成像,光斑成像在CCD(Charge-coupled Device,感光耦合組件)位置傳感器上。當被測物體沿激光方向發生移動時,…

【轉】如何實現一個文件系統

如何實現一個文件系統 摘要 本章目的是分析在Linux系統中如何實現新的文件系統。在介紹文件系統具體實現前先介紹文件系統的概念和作用,抽象出文件系統概念模型。熟悉文件系統的內涵后,我們再進一步討論Linux系統中文件系統的特殊風格和具體文件系統在Li…

【tenserflow】——數據類型以及常用屬性

目錄 一、什么是Tensor? 二、Tensorflow常見數據類型 三、Tensorflow常見屬性device\cpu\gpu\ndim\shape\rank等 1、創建一個tensor 1)tf.constant() 2)tf.Variable() 2、判斷一個變量是否為tensor張量 3、生成不同設備(cpu,gpu&#x…

C# 事件詳解附實例分析

一、定義 事件是兩個對象間發布消息和響應后處理消息的過程,通過委托類型來實現的。 事件的機制被稱為發布-訂閱機制,其算法過程為:首先定義一個委托類型,然后在發布者類中聲明一個event事件,同時此類中還有一個用來觸…

網頁開發瀏覽器兼容性問題

1、在ie6下的雙margin問題 在ie6下,設置了float的元素,以float:left為例,如圖所示。會出現第一個浮動元素,即相對于父級元素浮動的,會出現雙倍margin的問題。 注意僅僅是相對于父級元素浮動的,即第一個會出…

【tensorflow】——創建tensor的方法

目錄 1、tf.constant() 2、tf.Variable() 3、tf.zeros():用0去填充指定形狀的數組 4、tf.convert_to_tensor(a,dtypetf.int32) 5、tf.ones():用1去填充指定形狀的數組 6、tf.fill():用指定的元素去填充指定形狀的數組 7、隨機化初始化進行創建 1)normal正態分…

Halcon —— 圖像像素類型與轉換

圖像類型 就目前工業領域主流的圖像處理工具halcon來講,有以下幾種圖像類型:‘byte’, ‘complex’, ‘cyclic’, ‘direction’, ‘int1’, ‘int2’, ‘int4’, ‘int8’, ‘real’, ‘uint2’,具體含義如下圖所示。 ‘byte’ 每像素1字節…

軟件方法

核心工作流業務建模(組織建模):描述組織內部各個系統如何協作,使得組織可以為其他的組織提供有價值的服務,新系統只不過是組織為了對外提供更好的服務,對自己的內部重新設計而購買的一個零件。需求&#xf…

修改vim中的tab為4個空格

記錄一下,避免用時還得搜........ 1、臨時修改 在vi中,set tabstop4 或 set ts4  2、永久修改 vi --version 查看要修改的文件如果是vim的話,修改~/.vimrc如果是vi,修改~/.exrc加上:set tabstop4set nu //顯示行號set…

Halcon例程詳解(基于卡尺工具的匹配測量方法) —— measure_stamping_part.hdev

前言 1卡尺工具介紹 Halcon中的Metrology方法即為卡尺工具,可用來擬合線,圓,這種方法對于目標比背景很明顯的圖像尺寸測量是很方便的,不需要用blob進行邊緣提取等,但缺點也很明顯,需要目標的相對位置基本…