Skip to content

Commit fec8efb

Browse files
committed
创建对象
1 parent 96d5979 commit fec8efb

2 files changed

Lines changed: 23 additions & 0 deletions

File tree

MD/newObject.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# 创建对象
2+
3+
`JVM` 收到一个 `new` 指令时,会检查指令中的参数在常量池是否有这个符号的引用,还会检查该类是否已经被[加载](https://github.com/crossoverJie/Java-Interview/blob/master/MD/ClassLoad.md)过了,如果没有的话则要进行一次类加载。
4+
5+
接着就是分配内存了,通常有两种方式:
6+
7+
- 指针碰撞
8+
- 空闲列表
9+
10+
使用指针碰撞的前提是堆内存是完全工整的,用过的内存和没用的内存各在一边每次分配的时候只需要将指针向空闲内存一方移动一段和内存大小相等区域即可。
11+
12+
当堆中已经使用的内存和未使用的内存互相交错时,指针碰撞的方式就行不通了,这时就需要采用空闲列表的方式。虚拟机会维护一个空闲的列表,用于记录哪些内存是可以进行分配的,分配时直接从可用内存中直接分配即可。
13+
14+
堆中的内存是否工整是有垃圾收集器来决定的,如果带有压缩功能的垃圾收集器就是采用指针碰撞的方式来进行内存分配的。
15+
16+
分配内存时也会出现并发问题:
17+
18+
这样可以在创建对象的时候使用 `CAS` 这样的乐观锁来保证。
19+
20+
也可以将内存分配安排在每个线程独有的空间进行,每个线程首先在堆内存中分配一小块内存,称为本地分配缓存(`TLAB Thread Local Allocation Buffer`)
21+
22+

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
- [类加载机制](https://github.com/crossoverJie/Java-Interview/blob/master/MD/ClassLoad.md)
2020
- [OOM 分析](https://github.com/crossoverJie/Java-Interview/blob/master/MD/OOM-analysis.md)
2121
- [垃圾回收](https://github.com/crossoverJie/Java-Interview/blob/master/MD/GarbageCollection.md)
22+
- 创建对象过程分析
2223

2324
### 常用框架
2425

0 commit comments

Comments
 (0)