JVM——对象的创建与内存布局
生活随笔
收集整理的這篇文章主要介紹了
JVM——对象的创建与内存布局
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
導航
- 一、對象的創建過程
- 二、對象的內存布局
- 2.1 內存布局
- 2.2 計算對象的內存大小
- 三、對象的定位
- 3.1 句柄池
- 3.2 直接指針
- 四、對象的分配過程
一、對象的創建過程
對象,又叫實例,是 OOP 的最常用角色。
如何創建一個對象?一般都是使用 new 關鍵字搭配對象的構造函數:
// 基類的創建 Object obj = new Object(); // 普通用戶對象的創建 User user = new User("Tom", 29); // 服務類對象的創建 Service svic = new ServiceImpl(user);上述代碼創建了三個對象:obj、user、svic。
這個過程大致可以分為以下幾個步驟:
二、對象的內存布局
2.1 內存布局
在JVM 中,對象的內存布局分為:
對象頭包含兩類數據:
2.2 計算對象的內存大小
Java 語言并不具備類似 C 語言中的 sizeOf 函數,可以直接獲取對象的大小。但是,Java 提供了一個 agent 機制,可以通過這個機制來計算 Java 對象的內存大小。
Agent 機制簡單的理解就是,一個 class 要加載到內存,JVM 可以提供一個 Agent 代理來截獲這些 class 文件,以此來讀出整個Object 大小。
三、對象的定位
對象的定位指的是,引用是如何找到具體的實例數據地址的?
目前有兩種實現方式:句柄池、直接指針。
兩種方式各有優劣,句柄池的方式更安全,而直接指針更快。
3.1 句柄池
3.2 直接指針
四、對象的分配過程
首先,new 一個對象的時候,先往棧上分配,如果能分配的下,就直接分配在棧上,然后棧一彈出對象就沒了。如果棧上分配不下,特別大的話,直接分配到堆內存老年代。如果不大,首先會進行線程本地分配,如果能分配的下,就直接分配,如果分配不下,找 eden 區。
總結
以上是生活随笔為你收集整理的JVM——对象的创建与内存布局的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 白噪声检测_科学家尝试用智能扬声器的白噪
- 下一篇: css3 下边框缓缓划过_干货来袭!we