1.JDK1.8将方法区替换为了元空间,元空间使用的是直接内存,而不再虚拟机中。
2.方法区和永久代:《Java虚拟机规范》中只规定了方法区的概念和作用,而永久代时HotSpot虚拟机对规范的一种实现方式。
3.Java对象创建过程
类加载检查→分配内存→初始化零值→设置对象头→执行init方法
类加载检查:虚拟机执行new指令时,首先要检查这个指令的参数能否在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已经被加载过、解析和初始化过。如若没有则要执行类加载的过程。
分配内存:对象所需的内存大小在类加载完成后便可确定,之后便为对象分配空间。
初始化零值:内存分配完成后,虚拟机要将分配到的内存空间都初始化为零值(不包括对象头),以保证对象的实力字段在Java代码中可以不赋值便可以访问到这些数据类型对应的零值。
设置对象头:初始化零值后,虚拟机要对对象进行必要的设置,如这个对象时哪个类的实例、如何才能找到类的元数据信息,对象的哈希码、对象的GC分代年龄等信息。另外分局虚拟机当前运行状态的不同,如是否开启偏向锁等,对象头会有不同的设置方式。
执行init方法:只有执行init()方法后,才能将对象按照程序员的意愿进行初始化,这样,一个真正的对象才算完全产生出来。
4.静态常量池和运行时常量池
(静态)常量池:用于存放编译器生成的各种字面量和符号引用(符号引用区别于直接引用,后者在class字节码文件被虚拟机解析之后,符号引用将被替换为直接引用)。
运行时常量池:(静态)常量池中的内容在类加载(这里的类加载指cl
JVM基础杂记
最新推荐文章于 2021-02-25 16:08:29 发布