Flask接口签名sign原理与实例代码浅析
217
2023-01-11
详解JVM的内存对象介绍[创建和访问]
作为java程序员对应Object应该是非常熟悉的,但是对于对象在JVM中的一些情况并不是很清楚,所以本文就来记录下对象在JVM中的一些内容
对象的创建
java程序中创建对象的常用方式是:
Object obj = new Object();
该行代码的执行过程如下:
从图中我们可以发现对象创建的步骤如下
执行new执行
检查这个指令参数是否能够在常量池中定位到一个类的符号引用,并且检查这个符号引用所代表的类是否已经被加载,解析和初始化。
如果该类没有被加载则先执行类的加载操作
如果该类已经被加载,则开始给该对象在jvm的堆中分配内存。分配规则后面介绍
虚拟机初始化操作,虚拟机对分配的空间初始化为零值。
执行init方法,初始化对象的属性,至此对象被创建完成。
java虚拟机栈中的Reference执行我们刚刚创建的对象。
在上面的过程中的类加载的过程,后面会单独介绍,而内存分配这块我们来介绍下
内存的分配原则
内存分配的基本原则:
序号
介绍
1
优先在Eden分配,如果Eden空间不足虚拟机则会进行一次MinorGC
2
大对象直接接入老年代,很长的字符串或数组
3
长期存活的对象进入老年代,每个对象都有一个age,当age到达设定的年龄的时候就会进入老年代,默认是15岁
内存的分配方法
内存分配的方法有两种:指针碰撞(Bump the Pointhttp://er)和空闲列表(Free List)
分配方法
说明
收集器
指针碰撞
内存地址是连续的
Serial和ParNew收集器
空闲列表
内存地址不连续
cms收集器和Mark-Sweep收集器
内存分配的安全问题
在分配内存的同时,存在线程安全的问题,即虚拟机给A线程分配内存过程中,指针未修改,B线程可能同时使用了同样一块内存。
在JVM中有两种解决办法:
同步处理,即CAS(compare & swap)搭配失败重试的方式
将内存分配的动作按线程分配到不同空间中,每个线程都有一小块内存,成为本地线程分配缓冲(Thread Local Allocation Buffer即TLAB)。
对IEAMcrDOtj象的访问定位
建立对象是为了使用对象,java程序是通过栈上的reference数量来操作堆上的具体的对象,具体操作对象的方式有两种:
1.通过句柄访问对象
2.通过直接指针访问对象
两种方式的比较
方式
优点
句柄
稳定,对象被移动只要修改句柄中的地址
直接指针
访问速度快,节省了一次指针定位的开销
以上所述是给大家介绍的JVM的内存对象介绍[创建和访问]详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,会及时回复大家的。在此也非常感谢大家对我们网站的支持!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~