色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Java所承諾的自動內存管理

存儲界 ? 來源:未知 ? 作者:李倩 ? 2018-04-29 15:16 ? 次閱讀

Java所承諾的自動內存管理主要是針對對象內存的回收和對象內存的分配。

在Java虛擬機的五塊內存空間中,程序計數器、Java虛擬機棧、本地方法棧內存的分配和回收都具有確定性,一般在編譯階段就能確定需要分配的內存大小,并且由于都是線程私有,因此它們的內存空間都隨著線程的創建而創建,線程的結束而回收。也就是這三個區域的內存分配和回收都具有確定性,垃圾回收器不需要在這里花費太大的精力。

而Java虛擬機中的方法區因為是用來存儲類信息、常量、靜態變量,這些數據的變動性較小,因此不是Java內存管理重點需要關注的區域。

而對于堆,所有線程共享,所有的對象都需要在堆中創建和回收。雖然每個對象的大小在類加載的時候就能確定,但對象的數量只有在程序運行期間才能確定,因此堆中內存的分配具有較大的不確定性。此外,對象的生命周期長短不一,因此需要針對不同生命周期的對象采用不同的內存回收算法,增加了內存回收的復雜性。

綜上所述:Java自動內存管理最核心的功能是堆內存中對象的分配與回收。

對象優先在Eden區中分配

目前主流的垃圾收集器都會采用分代回收算法,因此需要將堆內存分為新生代和老年代。

在新生代中為了防止內存碎片問題,因此垃圾收集器一般都選用“復制”算法。因此,堆內存的新生代被進一步分為:Eden區+Survior1區+Survior2區。

每次創建對象時,首先會在Eden區中分配。

若Eden區已滿,則在Survior1區中分配。

若Eden區+Survior1區剩余內存太少,導致對象無法放入該區域時,就會啟用“分配擔保”,將當前Eden區+Survior1區中的對象轉移到老年代中,然后再將新對象存入Eden區。

大對象直接進入老年代

所謂“大對象”就是指一個占用大量連續存儲空間的對象,如數組。

當發現一個大對象在Eden區+Survior1區中存不下的時候就需要分配擔保機制把當前Eden區+Survior1區的所有對象都復制到老年代中去。

我們知道,一個大對象能夠存入Eden區+Survior1區的概率比較小,發生分配擔保的概率比較大,而分配擔保需要涉及到大量的復制,就會造成效率低下。

因此,對于大對象我們直接把他放到老年代中去,從而就能避免大量的復制操作。

那么,什么樣的對象才是“大對象”呢?

通過-XX:PretrnureSizeThreshold參數設置大對象

該參數用于設置大小超過該參數的對象被認為是“大對象”,直接進入老年代。

注意:該參數只對Serial和ParNew收集器有效。

生命周期較長的對象進入老年代

老年代用于存儲生命周期較長的對象,那么我們如何判斷一個對象的年齡呢?

新生代中的每個對象都有一個年齡計數器,當新生代發生一次MinorGC后,存活下來的對象的年齡就加一,當年齡超過一定值時,就將超過該值的所有對象轉移到老年代中去。

使用-XXMaxTenuringThreshold設置新生代的最大年齡

設置該參數后,只要超過該參數的新生代對象都會被轉移到老年代中去。

相同年齡的對象內存超過Survior內存一半的對象進入老年代

如果當前新生代的Survior中,年齡相同的對象的內存空間總和超過了Survior內存空間的一半,那么所有年齡相同的對象和超過該年齡的對象都被轉移到老年代中去。無需等到對象的年齡超過MaxTenuringThreshold才被轉移到老年代中去。

“分配擔保”策略詳解

當垃圾收集器準備要在新生代發起一次MinorGC時,首先會檢查“老年代中最大的連續空閑區域的大小 是否大于 新生代中所有對象的大小?”,也就是老年代中目前能夠將新生代中所有對象全部裝下?

若老年代能夠裝下新生代中所有的對象,那么此時進行MinorGC沒有任何風險,然后就進行MinorGC。

若老年代無法裝下新生代中所有的對象,那么此時進行MinorGC是有風險的,垃圾收集器會進行一次預測:根據以往MinorGC過后存活對象的平均數來預測這次MinorGC后存活對象的平均數。

如果以往存活對象的平均數小于當前老年代最大的連續空閑空間,那么就進行MinorGC,雖然此次MinorGC是有風險的。

如果以往存活對象的平均數大于當前老年代最大的連續空閑空間,那么就對老年代進行一次Full GC,通過清除老年代中廢棄數據來擴大老年代空閑空間,以便給新生代作擔保。

這個過程就是分配擔保。

注意:

1. 分配擔保是老年代為新生代作擔保;

2. 新生代中使用“復制”算法實現垃圾回收,老年代中使用“標記-清除”或“標記-整理”算法實現垃圾回收,只有使用“復制”算法的區域才需要分配擔保,因此新生代需要分配擔保,而老年代不需要分配擔保。

名詞解釋:

GC:垃圾收集器

Minor GC:新生代GC,指發生在新生代的垃圾收集動作,所有的Minor GC都會觸發全世界的暫停(stop-the-world),停止應用程序的線程,不過這個過程非常短暫。

Major GC/Full GC:老年代GC,指發生在老年代的GC。

JVM:Java Virtual Machine(Java虛擬機)的縮寫。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內存
    +關注

    關注

    8

    文章

    3052

    瀏覽量

    74217
  • JAVA
    +關注

    關注

    19

    文章

    2974

    瀏覽量

    104973

原文標題:JVM學習,對象內存的分配策略

文章出處:【微信號:cunchujie,微信公眾號:存儲界】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Java程序內存低效使用問題的分析

    Java程序內存的低效使用是導致其性能問題的主要因素。該文分析了泄漏對象、蚍蜉對象和空閑對象3類導致內存低效使用的情況,探討解決上述問題的方法,并提出構造對象行為模式
    發表于 04-09 09:39 ?12次下載

    java線程內存模型

    一、Java內存模型 按照官方的說法:Java 虛擬機具有一個堆,堆是運行時數據區域,所有類實例和數組的內存均從此處分配。 JVM主要管理
    發表于 09-27 10:55 ?0次下載
    <b class='flag-5'>java</b>線程<b class='flag-5'>內存</b>模型

    實例分析內存回收機制在java中的應用

    Java中,它的內存管理包括兩方面:內存分配(創建Java對象的時候)和內存回收,這兩方面工作
    發表于 09-27 15:10 ?0次下載
    實例分析<b class='flag-5'>內存</b>回收機制在<b class='flag-5'>java</b>中的應用

    Java內存模型及原理分析

    一、Java內存模型 按照官方的說法:Java 虛擬機具有一個堆,堆是運行時數據區域,所有類實例和數組的內存均從此處分配。 JVM主要管理
    發表于 09-28 11:49 ?0次下載
    <b class='flag-5'>Java</b><b class='flag-5'>內存</b>模型及原理分析

    Java內存區域分配、Java虛擬機棧、對象的訪問方式和GC

    對于Java程序員來說,在虛擬機的自動內存管理機制的幫助下,不再需要為每一個new操作去寫配對的delete/free代碼,而且不容易出現 內存
    發表于 12-11 16:28 ?2299次閱讀
    <b class='flag-5'>Java</b><b class='flag-5'>內存</b>區域分配、<b class='flag-5'>Java</b>虛擬機棧、對象的訪問方式和GC

    Android內存泄漏問題如何優化?

    作者:無名之輩FTER 來源:CSDN博客 眾所周知,Java因其擁有獨特的虛擬機(JVM)設計,使其成為一門跨平臺、內存自動管理的高級開發語言。所謂跨平臺,即一次編譯,多次運行,從而
    的頭像 發表于 09-11 15:55 ?1819次閱讀

    詳解Java虛擬機的JVM內存布局

    JVM內存布局規定了Java在運行過程中內存申請、分配、管理的策略,保證了JVM的穩定高效運行。不同的JVM對于內存的劃分方式和
    的頭像 發表于 07-13 09:52 ?542次閱讀
    詳解<b class='flag-5'>Java</b>虛擬機的JVM<b class='flag-5'>內存</b>布局

    java內存溢出的幾種原因和解決辦法

    Java是一種使用垃圾回收機制的編程語言,由于自動內存管理機制的存在,Java程序中發生內存溢出
    的頭像 發表于 11-23 14:44 ?6258次閱讀

    java內存溢出排查方法

    Java內存溢出(Memory overflow)是指Java虛擬機(JVM)中的堆內存無法滿足對象分配的需求,導致程序拋出OutOfMemoryError異常。
    的頭像 發表于 11-23 14:46 ?3316次閱讀

    如何查看java程序的內存分布

    。 程序計數器: 程序計數器是一塊較小的內存空間,它的作用是指示當前線程執行的字節碼指令的行號。在多線程環境下,每個線程都有一個獨立的程序計數器,用于記錄當前線程執行的字節碼指令。 Java虛擬機棧:
    的頭像 發表于 11-23 14:47 ?1092次閱讀

    jvm運行時內存區域劃分

    JVM是Java Virtual Machine(Java虛擬機)的縮寫,它是Java編程語言的運行環境。JVM的主要功能是將Java源代碼轉換為機器代碼,并且在運行時
    的頭像 發表于 12-05 14:08 ?560次閱讀

    jvm管理內存包括哪幾個運行時數據內存

    JVM(Java虛擬機)是Java程序的運行環境,它提供了內存管理機制來管理Java程序所需的運
    的頭像 發表于 12-05 14:09 ?594次閱讀

    jvm內存區域由哪幾部分組成

    。下面將詳細介紹這些部分。 堆內存(Heap Memory):堆內存是JVM中最大的一塊內存區域,用來存儲對象實例和數組對象。堆內存被所有線程
    的頭像 發表于 12-05 14:10 ?857次閱讀

    java虛擬機內存包括遠空間內存

    詳細介紹JVM內存的各個部分及其作用。 Java堆(Heap) Java堆是JVM管理的最大一塊內存區域,用于存放
    的頭像 發表于 12-05 14:15 ?425次閱讀

    深入理解Java 8內存管理機制及故障排查實戰指南

    Java自動內存管理機制是由 JVM 中的垃圾收集器來實現的,垃圾收集器會定期掃描堆內存中的對象,檢測并清除不再使用的對象,以釋放
    的頭像 發表于 04-04 08:10 ?1044次閱讀
    深入理解<b class='flag-5'>Java</b> 8<b class='flag-5'>內存</b><b class='flag-5'>管理</b>機制及故障排查實戰指南
    主站蜘蛛池模板: G0GO人体大尺香蕉 | 性啪啪chinese东北女人 | 女人精69xxxxx舒心 | 狠狠国产欧美在线视频 | 免费观看成人毛片 | 毛片在线看片 | 久久www免费人成_看片高清 | 在线精品一卡乱码免费 | 国产欧美另类久久久品 | 美女穿丝袜被狂躁动态图 | 亚洲国产成人99精品激情在线 | 且试天下芒果免费观看 | 99久久精品久久久久久清纯 | 久久视频这里只精品99热在线观看 | 插曲的痛30分钟视频最新章节 | 在线精品视频成人网 | 入禽太深免费高清在线观看5 | 久久精品热线免费 | bl高h文合集| 国产午夜精品自在自线之la | 97成人免费视频 | 久久亚洲AV无码精品午色夜麻豆 | 中文字幕乱码一区久久麻豆樱花 | 国语自产二区高清国语自产拍 | 国产h视频在线观看网站免费 | 4438成人情人网站 | 久久久久久九九 | 亚洲欧美日韩国产精品26u | 久久99热狠狠色一区二区 | 国产精品久久久久一区二区三区 | 暖暖视频免费高清在线观看 视频 | 老色69久久九九精品高潮 | 久久中文字幕无码A片不卡 久久中文字幕人妻熟AV女蜜柚M | 内射人妻骚骚骚 | 乱码国产丰满人妻WWW | 羽月希被黑人吃奶dasd585 | 小学生偷拍妈妈视频遭性教育 | 九九精品视频在线播放 | 秘密影院久久综合亚洲综合 | 在线黑人抽搐潮喷 | 囯产精品久久久久免费蜜桃 |