Java释疑

本文探讨了CAS操作的特点及其在并发控制中的应用,并详细介绍了非堆内存管理,包括元空间的使用及直接内存溢出的问题。同时,深入解析了方法区的垃圾回收机制,以及如何通过不同方式获取Class对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,cas本身跟自旋关系不大,一次cas要么成功要么失败,不会等待,所以非阻塞,网上铺天盖地自旋,是因为使用上要加上死循环或者尝试多次cas实现类似自旋的作用

2,非堆内存,比如元空间一般在fullgc 或者 直接内存 DirectByteBuffer等(一般也是fullgc),由程序自行释放即可

直接内存使用的本地内存不足时,java.lang.OutOfMemoryError:Direct buffer memory
元空间
元空间也是使用本地内存,java.lang.OutOfMemoryError: Metaspace

方法区的GC
常量池中废弃的变量:没有引用就回收

不再使用的类型:(判断这个条件苛刻并且费事)

该类的所有实例都被回收

加载类的加载器被回收

该类对应的Class对象没有被引用

实例对象(实例的instanceOopDesc,堆)——>实例的instanceKlass(方法区,元数据,同一个类加载器只有一份)——>实例的Class对象(实例的instanceOopDesc,堆,同一个类加载器只有一份,也反指向instanceKlass)。instanceOopDesc,只包含数据(对象头-Mark Word,元数据指针-指向方法区的instanceKlass实例,实例数据,如果是数组对象,再加上数组长度)。
所以,获取Class对象三种方式:
 1.Class.forName("ClassName"),通过类的元数据的Class对象引用获得Class对象:装入类,并做类的静态初始化,返回Class的对象。
 2.object.getClass(),通过实例对象保存的对类的元数据的引用获取类的元数据(instanceKlass),再通过instanceKlass中对Class对象的引用获取Class对象(instanceOopDesc):对类进行静态初始化、非静态初始化;返回引用o运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象。
 3.ClassName.class:通过类的元数据的Class对象引用获得class对象:将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值