JVM——对象的创建与内存布局
導(dǎo)航
- 一、對(duì)象的創(chuàng)建過程
- 二、對(duì)象的內(nèi)存布局
- 2.1 內(nèi)存布局
- 2.2 計(jì)算對(duì)象的內(nèi)存大小
- 三、對(duì)象的定位
- 3.1 句柄池
- 3.2 直接指針
- 四、對(duì)象的分配過程
一、對(duì)象的創(chuàng)建過程
對(duì)象,又叫實(shí)例,是 OOP 的最常用角色。
如何創(chuàng)建一個(gè)對(duì)象?一般都是使用 new 關(guān)鍵字搭配對(duì)象的構(gòu)造函數(shù):
// 基類的創(chuàng)建 Object obj = new Object(); // 普通用戶對(duì)象的創(chuàng)建 User user = new User("Tom", 29); // 服務(wù)類對(duì)象的創(chuàng)建 Service svic = new ServiceImpl(user);上述代碼創(chuàng)建了三個(gè)對(duì)象:obj、user、svic。
這個(gè)過程大致可以分為以下幾個(gè)步驟:
二、對(duì)象的內(nèi)存布局
2.1 內(nèi)存布局
在JVM 中,對(duì)象的內(nèi)存布局分為:
對(duì)象頭包含兩類數(shù)據(jù):
2.2 計(jì)算對(duì)象的內(nèi)存大小
Java 語言并不具備類似 C 語言中的 sizeOf 函數(shù),可以直接獲取對(duì)象的大小。但是,Java 提供了一個(gè) agent 機(jī)制,可以通過這個(gè)機(jī)制來計(jì)算 Java 對(duì)象的內(nèi)存大小。
Agent 機(jī)制簡(jiǎn)單的理解就是,一個(gè) class 要加載到內(nèi)存,JVM 可以提供一個(gè) Agent 代理來截獲這些 class 文件,以此來讀出整個(gè)Object 大小。
三、對(duì)象的定位
對(duì)象的定位指的是,引用是如何找到具體的實(shí)例數(shù)據(jù)地址的?
目前有兩種實(shí)現(xiàn)方式:句柄池、直接指針。
兩種方式各有優(yōu)劣,句柄池的方式更安全,而直接指針更快。
3.1 句柄池
3.2 直接指針
四、對(duì)象的分配過程
首先,new 一個(gè)對(duì)象的時(shí)候,先往棧上分配,如果能分配的下,就直接分配在棧上,然后棧一彈出對(duì)象就沒了。如果棧上分配不下,特別大的話,直接分配到堆內(nèi)存老年代。如果不大,首先會(huì)進(jìn)行線程本地分配,如果能分配的下,就直接分配,如果分配不下,找 eden 區(qū)。
總結(jié)
以上是生活随笔為你收集整理的JVM——对象的创建与内存布局的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 白噪声检测_科学家尝试用智能扬声器的白噪
- 下一篇: 排序算法——归并排序的相关问题