首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

当Jvm遇到new关键字

在上一篇我们知道了Jvm的内存划分,这一篇我们来具体分析一下,当我们用new关键字创建一个新对象时,Jvm都做了哪些工作。当虚拟机执行到new指令时,发现它是关键字,于是会检查这个指令参数是否能在常量池中找到相关的引用,并检查这个引用所代表的类是否被加载、解析和初始化过。如果没有被加载,则先执行类的加载过程。当类加载成功后,虚拟机就会为新创建的对象分配内存。分配内存无非就是在Java堆上划出一部分区域来作为新对象的存储空间。但在实际的处理时是比较麻烦的。例如怎么找到空闲的内存,如何划分固定大小内存。我们知道Java虚拟机规范中所说虚拟机中的堆内存可以是连续的也可以是不连续的。所以虚拟机在为对象分配新内存时,就要根据这两种不同的方式来采取不同的实现。这两种方式分别叫作:指针碰撞和空闲列表。正面我们分别看一下它们具体的实现方式。

02

浅谈对象的创建、内存布局和访问定位

这里的对象的创建是指普通的对象(不包括数组和Class对象)。对象的创建简单来说就是执行new的时候,虚拟机做出对应的响应。让我们看看一下虚拟机创建对象的过程: 1.虚拟机遇到new指令时,首先尝试在常量池中定位到对应类的符号引用,并检查这个符号引用代表类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程(后续会写一下关于类加载的问题)。 2.类加载检查通过后,为新生对象分配内存。对象内存的大小在类加载完成后便可完全确定。对象内存分配有“指针碰撞”和“空闲列表”两种方法,“指针碰撞”是把已用内存放到指针的一边,未用的放到另一边,以指针分隔,当需要分配一个新对象内存时把指针往未分配内存那边移动相对应的空间即可;“空闲列表”是因为内存已用的和未用的并不是规整的,它们是交错的,所以需要一个列表记录内存块的情况。Java堆是线程之间共享的内存,虚拟机采用CAS配上失败重试的方式保证更新操作的原子性保证内存指针修改并发安全性;另一种方法是“本地线程分配缓冲(Thread Local Allocation Buffer TLAB)”。 3.将虚拟机分配到的内存空间初始化为零值。 4.对对象进行必要的设置。其实是对对象头编写。 5.完成上面4个步骤执行new指令后会接着执行方法 到此对象才算完成生产出来。

06

Swift专题讲解十六——ARC在Swift中的应用

ARC(自动引用计数)是Objective-C和Swift中用于解决内存管理问题的方案。在学习Objective-C编程时经常会学习到一个关于ARC的例子:在一个公用的图书馆中,每次进入一人就将卡插入,走的时候将自己的卡拔出拿走。图书馆系统会判定只要有卡插入,就将图书馆的灯打开,当所有卡都被取走后,将图书馆的灯关掉。这个例子对应于Objective-C中的对象声明周期管理十分贴切。每当一个对象增加一个引用时,其引用计数会加1,当一个引用被取消时,对象的引用计数减1,当引用计数减为0时,说明此对象将不再有任何引用,对象会被释放掉,让出内存。Swift也采用同样的方式进行内存管理。

02
领券