对象创建的背后
正常人都知道,一个Java对象的创建通过new关键字创建。可是,在虚拟机中,一个对象是怎么创建的呢?下面简单的说一下
1、类加载的检查
虚拟机遇到一条new指令时,首先检查该指令的参数是否在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载,解析和初始化过,如果没有,必须先执行相应的类加载过程
2、内存的分配
对象所需内存的大小在类加载完成后便可确定,从Java堆中划分内存。
1.当Java堆内存规整时,用过与空闲的内存放在两边,中间的指针作为分界点指示器,此时通过指针碰撞(将指针往空闲内存移动一段与对象内存大小相等的距离) 完成内存分配。
2.当Java堆内存不规整时,由虚拟机维护一个空闲列表(Free List),该列表记录了可用的内存块,在分配时从列表中找到一块足够大的内存空间划分给对象实例,并更新列表。
内存分配的线程安全问题
比如,在给A分配内存,指针还未修改,B用了原来的指针分配内存。解决此类问题有两种方案:
1.对分配内存空间的动作进行同步处理
实际上虚拟机通过CAS配上失败重试的方式保证更新操作的原子性。
2.把内存分配的动作按照线程划分在不同的空间之中进行
即每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓冲(Thread Local Allocation Buffer,TLAB),只有TLAB用完并分配新的时,才需要同步锁定。
-XX:+/-UseTLAB参数设定是否使用TLAB
对象的必要设置
例如对象是哪个类的实例,如何找到类的元数据信息等,存放在对象的对象头之中。最后通过执行方法,一个对象就产生了
标签:视角,Java,对象,虚拟机,线程,内存,分配 来源: https://blog.csdn.net/weixin_47324454/article/details/120401228
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。