# ä½ æè®¤çäºè§£è¿èªå·±ç âJava 对象âå
> å¯¹è±¡å¨ JVM 䏿¯æä¹åå¨ç
>
> 对象头éæä»ä¹ï¼
>
> æç« æ¶å½å¨ GitHub [JavaKeeper](https://github.com/Jstarfish/JavaKeeper) ï¼N线äºèç½å¼åå¿
夿è½å
µå¨è°±ï¼æä½ æ³è¦çã
ä½ä¸ºä¸å Javaerï¼çæ´»ä¸çæä»¬å¯è½ææ¶æ²¡æå¯¹è±¡ï¼ä½æ¯å·¥ä½ä¸æ¯å¤©é½ä¼å建大éç Java 对象ï¼ä½ æè¯çå»äºè§£ä¸èªå·±çâ对象âåï¼
æä»¬ä»å个æ¹é¢éæ°è®¤è¯ä¸èªå·±çâ对象â
1. å建对象ç 6 ç§æ¹å¼
2. å建ä¸ä¸ªå¯¹è±¡å¨ JVM ä¸é½åçäºä»ä¹
3. å¯¹è±¡å¨ JVM ä¸çå
åå¸å±
4. 对象ç访é®å®ä½
## ä¸ãåå»ºå¯¹è±¡çæ¹å¼
- ä½¿ç¨ new å
³é®å
è¿æ¯å建ä¸ä¸ªå¯¹è±¡æéç¨ã常è§çæ¹æ³ï¼åæ¶ä¹æ¯æç®åçæ¹å¼ãéè¿ä½¿ç¨æ¤æ¹æ³ï¼æä»¬å¯ä»¥è°ç¨ä»»ä½è¦è°ç¨çæé 彿°ï¼é»è®¤ä½¿ç¨æ åæé 彿°ï¼
```java
Person p = new Person();
```
- ä½¿ç¨ Class ç±»ç newInstance()ï¼åªè½è°ç¨ç©ºåçæé å¨ï¼æéå¿
须为 public
```java
//è·å类对象
Class aClass = Class.forName("priv.starfish.Person");
Person p1 = (Person) aClass.newInstance();
```
- Constructor ç newInstance(xxx)ï¼å¯¹æé 卿²¡æè¦æ±
```java
Class aClass = Class.forName("priv.starfish.Person");
//è·åæé å¨
Constructor constructor = aClass.getConstructor();
Person p2 = (Person) constructor.newInstance();
```
- clone()
æ·±æ·è´ï¼éè¦å®ç° Cloneable æ¥å£å¹¶å®ç° clone()ï¼ä¸è°ç¨ä»»ä½çæé å¨
```java
Person p3 = (Person) p.clone();
```
- ååºåå
éè¿åºåååååºååææ¯ä»æä»¶æè
ç½ç»ä¸è·å对象çäºè¿å¶æµã
æ¯å½æä»¬åºåååååºåå对象æ¶ï¼JVM ä¼ä¸ºæä»¬å建äºä¸ä¸ªç¬ç«ç对象ãå¨ deserialization ä¸ï¼JVM ä¸ä½¿ç¨ä»»ä½æé 彿°æ¥å建对象ãï¼åºååç对象éè¦å®ç° Serializableï¼
```java
//åå¤ä¸ä¸ªæä»¶ç¨äºåå¨è¯¥å¯¹è±¡çä¿¡æ¯
File f = new File("person.obj");
FileOutputStream fos = new FileOutputStream(f);
ObjectOutputStream oos = new ObjectOutputStream(fos);
//åºåå对象ï¼åå
¥å°ç£çä¸
oos.writeObject(p);
//ååºåå
FileInputStream fis = new FileInputStream(f);
ObjectInputStream ois = new ObjectInputStream(fis);
//ååºåå对象
Person p4 = (Person) ois.readObject();
```
- ç¬¬ä¸æ¹åº Objenesls
Javaå·²ç»æ¯æéè¿ `Class.newInstance()` 卿å®ä¾å Java ç±»ï¼ä½æ¯è¿éè¦Javaç±»æä¸ªéå½çæé å¨ãå¾å¤æ¶åä¸ä¸ªJavaç±»æ æ³éè¿è¿ç§éå¾å建ï¼ä¾å¦ï¼æé å¨éè¦åæ°ãæé 卿å¯ä½ç¨ãæé å¨ä¼æåºå¼å¸¸ãObjenesis å¯ä»¥ç»è¿ä¸è¿°éå¶
## äºãåå»ºå¯¹è±¡çæ¥éª¤
è¿é讨论çä»
ä»
æ¯æ®é Java 对象ï¼ä¸å
嫿°ç»å Class å¯¹è±¡ï¼æ®éå¯¹è±¡åæ°ç»å¯¹è±¡çå建æä»¤æ¯ä¸åçãå建类å®ä¾çæä»¤ï¼newï¼å建æ°ç»çæä»¤ï¼newarrayï¼anewarrayï¼multianewarrayï¼
#### 1. newæä»¤
èææºéå°ä¸æ¡ new æä»¤æ¶ï¼é¦å
廿£æ¥è¿ä¸ªæä»¤çåæ°æ¯å¦è½å¨ Metaspace ç叏鿱 ä¸å®ä½å°ä¸ä¸ªç±»ç符å·å¼ç¨ï¼å¹¶ä¸æ£æ¥è¿ä¸ªç¬¦å·å¼ç¨ä»£è¡¨çç±»æ¯å¦å·²è¢«å è½½ãè§£æååå§åè¿ï¼å³å¤æç±»å
ä¿¡æ¯æ¯å¦åå¨ï¼ãå¦ææ²¡æï¼é£ä¹é¡»å¨åäº²å§æ´¾æ¨¡å¼ä¸ï¼å
æ§è¡ç¸åºçç±»å è½½è¿ç¨ã
#### 2. åé
å
å
æ¥ä¸æ¥èææºå°ä¸ºæ°ç代对象åé
å
åã对象æéçå
åç大å°å¨ç±»å è½½å®æå便å¯å®å
¨ç¡®å®ã妿å®ä¾æåå鿝å¼ç¨åéï¼ä»
åé
å¼ç¨åé空é´å³å¯ï¼å³ 4 个åè大å°ãåé
æ¹å¼æâ**æé碰æ**ï¼Bump the Pointerï¼âåâ**空é²å表**ï¼Free Listï¼âä¸¤ç§æ¹å¼ï¼å
·ä½ç±æéç¨çå徿¶é卿¯å¦å¸¦æå缩æ´çåè½å³å®ã
- 妿å
åæ¯è§æ´çï¼å°±éç¨âæé碰æâæ¥ä¸ºå¯¹è±¡åé
å
åãæææ¯ææç¨è¿çå
åå¨ä¸è¾¹ï¼ç©ºé²çå
åå¨å¦ä¸è¾¹ï¼ä¸é´æ¾çä¸ä¸ªæéä½ä¸ºåçç¹çæç¤ºå¨ï¼åé
å
åå°±ä»
ä»
æ¯ææéæå空é²é£è¾¹æªå¨ä¸æ®µä¸å¯¹è±¡å¤§å°ç¸ççè·ç¦»ç½¢äºã妿å徿¶éå¨éç¨çæ¯ SerialãParNew è¿ç§åºäºåç¼©ç®æ³çï¼å°±éç¨è¿ç§æ¹æ³ãï¼ä¸è¬ä½¿ç¨å¸¦æ´çåè½çå徿¶éå¨ï¼é½éç¨æé碰æï¼

- 妿å
忝ä¸è§æ´çï¼èææºéè¦ç»´æ¤ä¸ä¸ªå表ï¼è¿ä¸ªå表ä¼è®°å½åªäºå
忝å¯ç¨çï¼å¨ä¸ºå¯¹è±¡åé
å
åçæ¶åä»åè¡¨ä¸æ¾å°ä¸åè¶³å¤å¤§ç空é´ååç»è¯¥å¯¹è±¡å®ä¾ï¼å¹¶æ´æ°å表å
容ï¼è¿ç§åé
æ¹å¼å°±æ¯â空é²å表âã使ç¨CMS è¿ç§åºäºMark-Sweep ç®æ³çæ¶é卿¶ï¼é常éç¨ç©ºé²å表ã

> æä»¬é½ç¥éå å
åæ¯çº¿ç¨å
±äº«çï¼é£å¨åé
å
åçæ¶åå°±ä¼åå¨å¹¶åå®å
¨é®é¢ï¼JVM æ¯å¦ä½è§£å³çå¢ï¼
ä¸è¬æä¸¤ç§è§£å³æ¹æ¡ï¼
1. 对åé
å
å空é´çå¨ä½å忥å¤çï¼éç¨ CAS æºå¶ï¼é
å失败éè¯çæ¹å¼ä¿è¯æ´æ°æä½çååæ§
2. æ¯ä¸ªçº¿ç¨å¨ Java å ä¸é¢å
åé
ä¸å°åå
åï¼ç¶ååç»å¯¹è±¡åé
å
åçæ¶åï¼ç´æ¥å¨èªå·±è¿å"ç§æ"å
åä¸åé
ï¼å½è¿é¨ååºåç¨å®ä¹åï¼ååé
æ°ç"ç§æ"å
åãè¿ç§æ¹æ¡ç§°ä¸º **TLAB**ï¼Thread Local Allocation Bufferï¼ï¼è¿é¨å Buffer æ¯ä»å ä¸åååºæ¥çï¼ä½æ¯æ¯æ¬å°çº¿ç¨ç¬äº«çã
**è¿éå¼å¾æ³¨æçæ¯ï¼æä»¬è¯´ TLAB æ¯çº¿ç¨ç¬äº«çï¼åªæ¯å¨âåé
âè¿ä¸ªå¨ä½ä¸æ¯çº¿ç¨ç¬å çï¼è³äºå¨è¯»åãåå¾åæ¶çå¨ä½ä¸é½æ¯çº¿ç¨å
±äº«çãèä¸å¨ä½¿ç¨ä¸ä¹æ²¡æä»ä¹åºå«**ãå¦å¤ï¼TLAB ä»
ä½ç¨äºæ°ç代ç Eden Spaceï¼å¯¹è±¡è¢«åå»ºçæ¶åé¦å
æ¾å°è¿ä¸ªåºåï¼ä½æ¯æ°ç代åé
ä¸äºå
åç大对象ä¼ç´æ¥è¿å
¥è年代ã**å æ¤å¨ç¼å Java ç¨åºæ¶ï¼é常å¤ä¸ªå°ç对象æ¯å¤§ç对象åé
èµ·æ¥æ´å 髿**ã
èææºæ¯å¦ä½¿ç¨ TLAB æ¯å¯ä»¥éæ©çï¼å¯ä»¥éè¿è®¾ç½® `-XX:+/-UseTLAB` åæ°æ¥æå®ï¼JDK8 é»è®¤å¼å¯ã
#### 3. åå§å
å
ååé
宿åï¼èææºéè¦å°åé
å°çå
å空é´é½åå§å为é¶å¼ï¼ä¸å
æ¬å¯¹è±¡å¤´ï¼ï¼è¿ä¸æ¥æä½ä¿è¯äºå¯¹è±¡çå®ä¾åæ®µå¨ Java 代ç ä¸å¯ä»¥ä¸èµåå§å¼å°±ç´æ¥ä½¿ç¨ï¼ç¨åºè½è®¿é®å°è¿äºåæ®µçæ°æ®ç±»åæå¯¹åºçé¶å¼ãå¦ï¼byteãshortãlong 转å为对象ååå§å¼ä¸º 0ï¼Boolean åå§å¼ä¸º falseã
#### 4. 对象çåå§è®¾ç½®ï¼è®¾ç½®å¯¹è±¡ç对象头ï¼
æ¥ä¸æ¥èææºè¦å¯¹å¯¹è±¡è¿è¡å¿
è¦ç设置ï¼ä¾å¦è¿ä¸ªå¯¹è±¡æ¯åªä¸ªç±»çå®ä¾ãå¦ä½æè½æ¾å°ç±»çå
æ°æ®ä¿¡æ¯ã对象çåå¸ç ã对象çGCå代年é¾çä¿¡æ¯ãè¿äºä¿¡æ¯åæ¾å¨å¯¹è±¡ç对象头ï¼Object Headerï¼ä¹ä¸ãæ ¹æ®èææºå½åçè¿è¡ç¶æçä¸åï¼å¦å¯¹å¦å¯ç¨ååéçï¼å¯¹è±¡å¤´ä¼æä¸åç设置æ¹å¼ã
#### 5. \