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>方法
类加载器
运行时栈帧结构
方法调用和分派
JMM规定所有内存都存储于主内存中,每条线程还有自己的工作内存。
变量的读取、赋值操作必须在工作内存中进行。
内存直接的交互操作,主要有以下8种操作:
8种操作需要满足以下规则
volatile关键字
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。