1. 程式人生 > >物件建立方法,物件的記憶體分配,物件的訪問定位

物件建立方法,物件的記憶體分配,物件的訪問定位

物件建立方法:

  JVM遇到一條new指令時,首先檢查這個指令的引數是否能在常量池中定位到一個類的符號引用,並且檢查這個符號引用代表的類是否已被載入、連線和初始化過。

如果沒有,那必須先執行相應的類的載入過程。

物件的記憶體分配:

  物件所需記憶體的大小在類載入完成後便完全確定(物件記憶體佈局),為物件分配空間的任務等同於把一塊確定大小的記憶體從Java堆中劃分出來。

根據Java堆中是否規整有兩種記憶體的分配方式:

  指標碰撞:所有用過的記憶體在一邊,空閒記憶體在另一邊,中間放著一個指標作為分界點的指示器,

分配記憶體就是把指標往空閒記憶體那邊挪一段與物件大小相等的距離。在使用Serial,ParNew等收集器,

(也就是用複製演算法,標記-整理演算法的收集器),分配演算法通常採用指標碰撞。

  空閒列表:虛擬機器維護一個列表,記錄哪些記憶體是可用的,分配的時候從列表中找到一塊足夠大的空間劃分給物件,並更新列表。

使用CMS這種基於標記-清除演算法的收集器,通常用空閒列表。

  物件建立在虛擬機器中時非常頻繁的行為,即使是僅僅修改一個指標指向的位置,在併發情況下也並不是執行緒安全的,可能出現正在給物件A分配記憶體,指標還沒來得及修改,物件B又同時使用了原來的指標來分配記憶體的情況。

同步

  虛擬機器採用CAS配上失敗重試的方式保證更新操作的原子性

本地執行緒分配緩衝(Thread Local Allocation Buffer, TLAB)

  把記憶體分配的動作按照執行緒劃分為在不同的空間之中進行,即每個執行緒在Java堆中預先分配一小塊記憶體(TLAB)。

  哪個執行緒要分配記憶體,就在哪個執行緒的TLAB上分配。只有TLAB用完並分配新的TLAB時,才需要同步鎖定。

  記憶體分配完之後,虛擬機器要將分配到的記憶體空間都初始化為零值(不包括物件頭),保證了物件的例項欄位在Java程式碼中可以不賦初始值就直接使用。

物件的記憶體佈局:

  物件在記憶體中可分為3個部分,物件頭,例項資料,對齊填充。

  物件頭的第一部分用於儲存物件自身的執行時資料,如物件的雜湊碼,GC分代年齡,鎖狀態標誌,執行緒持有的鎖等。

  另一部分是型別指標,即物件指向它的類元資料的指標,通過這個來確定這個物件是哪個類的例項。

  例項資料是物件真正儲存的有效資訊。

物件的訪問定位:

  程式要通過棧上的reference資料來操作堆上的具體物件。物件的訪問方式有使用控制代碼直接指標

  使用控制代碼:java堆會劃分一塊記憶體作為控制代碼池,reference中存的是物件的控制代碼地址,而控制代碼中包含了物件的例項資料的地址和型別資料的地址(在方法區)

優點:物件被移動,reference不用修改,只會改變控制代碼中儲存的地址。

  使用直接指標:reference中存的是物件的地址,物件中分一小塊記憶體儲存型別資料的地址。優點:速度快。

相關推薦

物件建立方法物件記憶體分配物件訪問定位

物件建立方法:   JVM遇到一條new指令時,首先檢查這個指令的引數是否能在常量池中定位到一個類的符號引用,並且檢查這個符號引用代表的類是否已被載入、連線和初始化過。 如果沒有,那必須先執行相應的類的載入過程。 物件的記憶體分配:   物件所需記憶體的大小在類載入完成後便完全確定(物件記憶體佈局),為物件

2018-10-16 Rigidbody剛體移動物件方法MovePosion及transform.Translate()移動物件

private Rigidbody rigidbody;//宣告剛體物件 private Transform tran;//申明物件Transforma物件 public float speed = 0.2f; // Use this for initialization

Java 用面向物件方法求集合的交集差集並集

注意事項: 在自定義類中的成員屬性是兩個集合 在求集合的交集,差集,並集時,會修改成員屬性的這兩個集合的物件。即,若是求交集,使用的是list1.retainAll(list2)方法,此時,集合1中只剩下與集合2 相同的資料,當再求差集時,就會差生錯誤 消除

jvm記憶體分配物件建立和回收過程

Java歷史 2004.9 jdk1.5 tiger 自動裝箱拆箱,泛型,,註解,列舉,變長引數,增強for迴圈 spring2.x spring4.x 2006 jdk1.6 javaee Javase Javame jdk6 提供指令碼支援 提供編譯

Java物件(例項)建立涉及到的記憶體分配及相關事宜

1 成員變數 成員變數和區域性變數不一樣,首先是作用域不同:成員變數的作用域在整個類裡,而成員變數的作用域在定義它的程式碼塊裡;其次是區域性變數沒有顯式初始化使用該區域性變數,編譯器會報錯,但是成員變數在沒有顯式初始化的時候,編譯器會為其初始化一個預設值。 2 引用

讀書筆記《深入理解Java虛擬機器》 (三)物件已死?與記憶體分配策略

物件是否可回收 引用計數演算法 給物件新增一個引用計數器,每當有一個地方引用它時,計數器值就加1;當引用失效時就減1;當等於0時就認為物件不可能再被使用。問題:當兩個物件相互引用時,就無法回收了。 可達性分析演算法 通過一系列的稱為“GC Roots”的物件作為起

jvm學習筆記(3)——java物件記憶體分配物件的回收(GC)

引言:         之前的文章已經提過,java物件例項是存放在堆上的,至於是在伊甸區、存活區還是老年區,這些都是從物件回收(GC)角度來進行的邏輯劃分。所以我們先說物件的回收(GC),然後再依據GC的策略來說明新的物件具體在哪個區生成。 GC(Garbage C

深入理解JVM學習筆記(二十七、JVM 記憶體分配----大物件直接分配到老年代)

一、驗證 首先我們編寫如下程式 package com.zjt.test.jvm008; public class Main { public static void main(String[]

[AngularJS面面觀] 13. Angular工具庫 --- 異常物件建立方法minErr

本系列文章會討論Angular框架除了提供scope等核心功能外,還提供了哪些功能。 作為Angular工具庫這一系列文章的開篇,首先來看看但凡程式都繞不開的一個話題 - 異常。 那麼Angular在異常處理方面又提供了哪些工具呢? 引子 - scop

new與malloc的區別以及記憶體分配淺析

二、malloc()到底從哪裡得來了記憶體空間: 1、malloc()到底從哪裡得到了記憶體空間?答案是從堆裡面獲得空間。也就是說函式返回的指標是指向堆裡面的一塊記憶體。作業系統中有一個記錄空閒記憶體地址的連結串列。當作業系統收到程式的申請時,就會遍歷該連結串列,然後就尋找第一個空間大於所申請空間的堆結點,

STL六大元件之——分配器(記憶體分配好深奧的東西)

SGI設計了雙層級配置器,第一級配置器直接使用malloc()和free(),第二級配置器則視情況採用不同的策略:當配置區塊超過128bytes時,視之為“足夠大”,便呼叫第一級配置器;當配置區小於128bytes時,視之為“過小”,為了降低額外負擔,便採用複雜的memo

MYSQLinnodb_buffer_pool_size記憶體分配方式

以前一直以為MYSQL,innodb_buffer_pool_size=8G,MySQL一起動就會將佔用掉8G記憶體(認為TOP可以看到記憶體被使用了8G),但是最近才仔細研究一下,原來不是這樣的(可能自己對Linux malloc記憶體分配也只是知道了個皮毛吧),MyS

mysql數據庫用戶的創建權限分配刪除等

ins delete let delet type rev str ges nts 1.創建用戶 CREATE USER 用戶名@‘IP地址‘ identified by ‘密碼‘;CREATE USER 用戶名@‘%‘ identified by ‘密碼‘;ps:%表示所

PHP 實現大資料(30w量級)表格匯出(匯出excel) 提高效率減少記憶體消耗終極解決方案

使用php做專案開發的同學,一定都會有過使用php進行excel表格匯出的經歷,當匯出少量資料還好,一旦資料量級達到5w、 10w、20w甚至30以上的時候就會面臨同樣的問題: 1、匯出時間變得很慢,少則1分鐘,多則好幾分鐘,資料量一旦上來,還可能面臨導不出來的困窘(這種匯出效率正常人都會受

介面資料量太大導致記憶體溢位解決辦法

通常我們使用介面呼叫資料總是返回一段我們需要的資訊,或者是json 格式資訊,通過接收將資料儲存到程式當中,再對接收到的資料進行轉換成對應的模型格式 。目前遇到的問題是接收的資料量過於巨大,導致完整接收將導致記憶體溢位,無法進行接下去的工作 。 解決辦法: 我們將資料儲存到本地檔案 ,再通過

什麼情況下會發生堆記憶體溢位記憶體溢位結合例項說明

一、 棧溢位(StackOverflowError) 棧是執行緒私有的,他的生命週期與執行緒相同,每個方法在執行的時候都會建立一個棧幀,用來儲存區域性變量表,運算元棧,動態連結,方法出口燈資訊。區域性變量表又包含基本資料型別,物件引用型別(區域性變量表編譯器完成,執行期間不會

虛擬記憶體虛擬記憶體地址實體記憶體實體記憶體地址

計算機會對虛擬記憶體地址空間(32位為4G)分頁產生頁(page),對實體記憶體地址空間(假設256M)分頁產生頁幀(page frame),這個頁和頁幀的大小是一樣大的,所以呢,在這裡,虛擬記憶體頁的個數勢必要大於實體記憶體頁幀的個數。在計算機上有一個頁表(page table),就是對映虛擬記憶體頁到實體

JavaWeb_監聽域物件建立和銷燬的Listener1一d物件

1簡介 監聽器:專門用於對其他物件身上發生的事件或狀態改變進行監聽和相應處理的物件,當被見識的物件發生情況時,立即採取相應的行動。 Servlet監聽器:Servlet規範中定義的一種特殊類,它用於監

springmvc和springboot分別設定攔截器列印記憶體資訊訪問時間等日誌資訊

SpringMVC提供了一個攔截器介面供我們呼叫:HandlerInterceptor,這個介面有三個待實現的方法: preHandle方法 進入 Handler方法之前執行 用於身份認證、身份授權 比如身份認證,如果認證不通

Android】開發優化之——調優工具:dump hprof file 檢視記憶體情況找到記憶體洩露androidhprof

如何用MAT來分析,前提是Android開發和測試的工具安裝完整,SDK,Eclipse: 1.開啟Eclipse 2.選擇 Help->Install New Software; 3.在Work with中新增站點:download.eclipse.org/mat/1.0/update-site/(這