JVM进阶之卡表

1. TLAB

堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的。
JVM为了提升内存分配的效率,对于所创建的线程都会分配一块独立的空间TLAB(Thread Loal Allocation Buffer),其大小由JVM根据运行的情况计算而得,在TLAB上分配对象不需要加锁,因此JVM在给线程的对象分配内存时会尽量的在TLAB上分配,在这种情况下JVM中分配内存对象内存的性能和C是一样高效的,但如果对象过大的话则仍然是直接使用堆内存分配。

TLAB仅作用于新生代的Eden Space,因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效。

聊完了TLAB后,我们继续看看对象在堆内存中是如何流转的。
所有新创建的Object都会存储在新生代中,如果Eden区的空间耗尽了,JVM则会触发一次Minor GC,来收集新生代的垃圾。存活下来的对象,则会被送到Survivor区。Survivor有两个区,分别叫做from和to,其中to指向的Survivor区是空的,当发生Minor GC时,Eden区和from指向的Survivor区中的存活对象就会被复制到to指向的Survivor区中,然后交换from和to指针。

1.1 分配对象

Java中对象地址操作主要使用了Unsafe调用了C的allocate和free两个方法,分配方法有两种:

  • 空闲链表(free list):通过额外的存储记录空闲的地址,将随机IO变成顺序IO,但带来了额外的空间消耗。
  • 碰撞指针(bump pointer):通过一个指针作为分界点&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值