
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在上文中给大家简单介绍了Java编程虚拟机栈的一些基础知识,而今天我们就再来了解一下,Java编程对象创建需要注意哪些问题。
虚拟机遇到一条new指令时,先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过,如果没有,先执行相应的类加载过程,接下来为新生对象分配内存。为对象分配空间的任务等同于把一块确定大小的内存从堆中划分出来。划分方式按照堆内存是否规整分为两种。
堆内存规整
可以采用指针碰撞方式解决,即所有被使用过的内存都放到一边,空闲的内存被放到另一边,中间放着一个指针作为分界点的指示器,那所分配的内存就仅仅是把那个指针向空闲空间方向挪动一段与对象大小相等的距离。
堆内存不规整
可以采用空闲列表的方式解决,空闲和使用的内存相互交错,JVM必须维护一个列表,记录哪些内存块是可用的,分配时候找到一块足够大的分配给对象实例。
安全性
我们还有一个问题值得考虑的是,如果在并发情况下,对象的创建是否安全呢,会不会出现正在给对象A分配内存,指针还没来得及修改,对象B又同时使用了原来的指针来分配内存。废话,肯定会出现这样的情况,可以有两种办法解决:
①可以对分配内存空间的动作进行同步处理,这实际上是虚拟机采用CAS加上重试机制保证更新操作的原子性。
②把内存分配的动作按照线程划分在不同的空间中进行,即每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓冲(TLAB),哪个线程要分配内存,就在哪个线程的TLAB上分配,只有TLAB用完并分配心得TLAB时,才需要同步锁定。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请在707945861群中学习了解。