java虚拟机详解

Java虚拟机示意图

方法区(持久代)

存放class信息和类的静态方法和属性、常量。大小由-XX:PermSize来调节

用于存放类的实例化对象信息的 堆大小由-Xmx 和 -Xms来调节

分为{Old + New={Eden,from,to}}

存放方法执行时的局部变量、执行顺序等 栈大小由Xss来调节

程序计数器

它的作用是当前线程所执行的字节码的行号指示器。

本地方法栈

JVM采用本地方法栈来支持native方法的执行,此区域用于储存每个native方法调用的状态。

例子 -XX:MaxPermSize=512m -Xms256M -Xmx512M -XX:PermSize=256m介绍几个常用的配置选项

类加载过程类加载机制是双亲委派机制

双亲委派机制避免了一个类被多次加载。

类装载过程

Loading[加载]

将文件系统中的Class文件载入到JVM内存(运行数据区域)

Verifying[验证]

将已经读入到内存类的二进制数据合并到虚拟机运行时环境中去。

类文件结构检查:格式符合jvm规范-语义检查:符合java语言规范,final类没有子类,final类型方法没有被覆盖

字节码验证:确保字节码可以安全的被java虚拟机执行.

Preparing[准备]

java虚拟机为类的静态变量分配内存并赋予默认的初始值.如int分配4个字节并赋值为0,long分配8字节并赋值为0;

Resolving[解析]

将该类常量池中的符号引用都改变为直接引用。

Initialing[初始化]

初始化类的局部变量,为静态域赋值,同时执行静态初始化块。

使用

卸载

初始化时机主动初始化的6种方式

创建对象实例:new 对象的时候,会依法类的初始化,前提这个类没有被初始化

调用类的静态属性或为静态属性赋值

调用类的静态方法

通过class 文件反射创建对象。

初始化一个类的子类:使用子类的时候先初始化父类

Java虚拟机启动时被标记为启动类的类:比如main方法所在的类不会进行初始化的情况

在同一个类加载器下面只能初始化类一次,如果一斤初始化了就不必要初始化了。

在编译的时候能确定下来的静态变量(编译常量),不会对类进行初始化。比如final 修饰的静态变量。

类的实例化的初始化步骤没有父类的情况

类的静态属性

类的静态代码块

类的非静态属性

类的非静态代码块

构造方法有父类的情况

父类的静态属性

父类的静态代码块

子类的静态属性

子类的静态代码块

父类的非静态属性

父类的非静态代码块

父类构造方法

子类非静态属性

子类非静态代码块

子类构造方法

在多次类实例化中,类静态属性和方法只会实例化一次,也就是执行一次

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();