Skip to content

Commit 6228ba6

Browse files
committed
更新
1 parent 2e848f3 commit 6228ba6

File tree

1 file changed

+0
-17
lines changed

1 file changed

+0
-17
lines changed

MD/MemoryAllocation.md

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,3 @@ Java 堆是整个虚拟机所管理的最大内存区域,所有的对象创建
3333
### 运行时常量池
3434

3535
运行时常量池是方法区的一部分,其中存放了一些符号引用。当 new 一个对象时,会检查这个区域是否有这个符号的引用。
36-
37-
38-
## 创建对象
39-
`JVM` 收到一个 `new` 指令时,会检查指令中的参数在常量池是否有这个符号的引用,还会检查该类是否已经被[加载](https://github.com/crossoverJie/Java-Interview/blob/master/MD/ClassLoad.md)过了,如果没有的话则要进行一次类加载。
40-
41-
接着就是分配内存了,通常有两种方式:
42-
43-
- 指针碰撞
44-
- 空闲列表
45-
46-
使用指针碰撞的前提是堆内存是完全工整的,用过的内存和没用的内存各在一边每次分配的时候只需要将指针向空闲内存一方移动一段和内存大小相等区域即可。
47-
48-
当堆中已经使用的内存和未使用的内存互相交错时,指针碰撞的方式就行不通了,这时就需要采用空闲列表的方式。虚拟机会维护一个空闲的列表,用于记录哪些内存是可以进行分配的,分配时直接从可用内存中直接分配即可。
49-
50-
堆中的内存是否工整是有垃圾收集器来决定的,如果带有压缩功能的垃圾收集器就是采用指针碰撞的方式来进行内存分配的。
51-
52-
分配内存时也会出现并发问题,这样可以在创建对象的时候使用 `CAS` 这样的乐观锁来保证。

0 commit comments

Comments
 (0)