对象的创建与内存分配

当jvm收到一个new指令时,会检查指令中的参数是否存在这个符号的引用,还会检测 这个类是否已经被加载过了,否则还会进行一次类的加载

分配内存通常的两种形式:

  • 指针碰撞

  • 空闲列表

    指针碰撞

    使用指针碰撞的前提是对内存是完整的,用过的内存和没用的内存各在一边,每次

    分配的时候只需要将指针向空闲内存一方移动一段和内存大小相等区域即可。

也可以将内存分配安排在每个线程独有的空间进行,每个线程首先在堆内存中分配 一小块内存,称为本地分配缓存(TLAB : Thread Local Allocation Buffer)

空闲列表

这种适用于内存非规整的情况,这种情况下JVM会维护一个内存列表,记录哪些内存 区域是空闲的,大小是多少。给对象分配空间的时候去空闲列表里查询到合适的区域然后进行分配即可。

JVM 并发

1 CAS:实际上虚拟机采用CAS配合上失败重试的方式保证更新操作的原子性,原理和上面讲的一样。
2 TLAB:如果使用CAS其实对性能还是会有影响的,所以JVM又提出了一种
更高级的优化策略:每个线程在Java堆中预先分配一小块内存,
称为本地线程分配缓冲区(TLAB),线程内部需要分配内存时直接在TLAB上
分配就行,避免了线程冲突。只有当缓冲区的内存用光需要重新分配内存的
时候才会进行CAS操作分配更大的内存空间。

Last updated