Java虚拟机运行时数据区,分为以下几个模块,包含所有线程共有的数据区和线程单独享有的数据区。

JVM通过根搜索算法来判定对象是否可以回收,一般对于不能从根(GC Roots)搜索到的对象是可以被回收的。
能够被作为GC Roots对象有:虚拟机栈本地变量表中引用的对象(也就是正在调用的方法中引用的);方法区中静态属性或常量引用的对象;本地方法栈引用的对象。
可以被回收的对象并不一定绝对被回收,JVM先做一次标记和筛选,把那些覆盖了finalize方法的对象筛选出来然后触发finalize方法,如果在finalize方法中对象复活,则不回收,否则回收,且finalize方法仅会被触发一次。
垃圾回收算法
内存分配与回收策略
class文件是二进制组成的,class有两种数据类型:无符号数和表。
无符号数是基础数据类型,其中u1表示1个字节、u2表示2个字节(一个字节8个bit,而4个bit可以表示1个16进制的数,也就是说1个字节可以用2个16进制数表示);
表是由多个无符号数或其它表构成的。

类加载的时机
主动引用的几种情况才会加载(前提是此类没有被加载过)
被动引用不会触发初始化
加载过程
连接过程
初始化过程
初始化过程主要是执行类构造器<cinit>方法

类加载器

运行时栈帧结构
注意,如果没有int a = 0这一行代码,placeholder是不会被回收的,因为如果不加这行代码,就没有任何对局部变量表的读写操作,这个slot就不会被占用。方法调用和分派




JMM规定所有内存都存储于主内存中,每条线程还有自己的工作内存。
变量的读取、赋值操作必须在工作内存中进行。
内存直接的交互操作,主要有以下8种操作:

8种操作需要满足以下规则
volatile关键字

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。