Java入门之了解JVM(25)

堆中的内存是如何分配给对象的?

在jvm中存在两种分配方式:指针碰撞、空闲列表

而采用哪种方式,取决于使用的GC收集器是否有压缩整理功能,即取决与GC收集器使用的是什么算法,有则使用 "指针碰撞" 没有则使用 "空闲列表"

关于虚拟机分配内存的线程安全问题

首先虚拟机分配内存这个动作并不是线程安全的;例如使用指针碰撞方法分配内存的情况下,正当要给A对象调节指针位置给其分配内存时,调节指针位置可能会被其他对象抢先一步,这样就会出先问题了

针对上面的问题,JVM有两种方法解决:

堆分配内存的整合动作进行同步(通过CAS加失败重试)使用TLAB(本地线程分配缓存),即预先分配一小块内存给线程,当线程中有创建对象的动作时,就各自的这一小块内存中进行内存分配,不够时再申请TLAB外的内存;是否使用TLAB可以通过设置参数-XX:+UseTLAB来开启TLAB,默认是开启的关于内存逃逸分析

参考文章:http://www.hollischuang.com/archives/2398

推荐阅读