JVM运行时数据区
1.1 程序计数机(PCR)的定义 特点和作用
定义:是一块较小的内存空间,可以看成当前线程正在执行的字节码的行号指示器
如果是java方法,计数器记录的就是当前线程正在执行的字节码指令地址
如果是本地方法,那么程序计数器值为undefined
作用:字节码解释器通过改变PCR依次读取指令,实现代码的流程控制。如顺序执行,异常处理
多线程情况下,PCR用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程执行到哪了。
特点:较小的内存空间,每个线程都有一个独立的程序计数器。
1.2 Java虚拟机栈(JVM Stack)
定义:是描述java方法执行的内存区域,属于线程私有,用于支持虚拟机进行方法调用,每个方法调用到执行完成的过程就是从入栈到出栈的过程。
作用:存放方法参数和局部变量
特点:局部变量表的创建是在方法被执行的时候,随着栈帧创建而创建。表的大小在编译时就确定。栈内存默认最大是1M.
java虚拟机栈也是线程私有的,每个线程都有各自的java虚拟机栈,而且随着线程的创建而创建,随着线程的死亡而死亡。
1.3 本地方法栈(Native Method Stack)
定义:是用于管理Native Method(本地方法)的调用,主要是用C和C++实现
特性:线程私有 后进先出 作用是支撑Native方法调用,执行和退出
1.4 Java堆(Java Heap)
定义:是一块内存区域,jvm启动时创建,存放所有的类实例以及数组对象,除此之外,还可以保存对象其他信息,如(哈希码,GC标志,同步锁信息)。
特点:java虚拟机所需管理的内存中最大的一块,是所有线程共享的一块内存区域,在虚拟机启动时创建,大小可以固定也可以扩展。
1.5 方法区(用来存放方法和static变量。)
定义:是堆的一个逻辑区划部分,护体实现根据不同虚拟机来实现。主要存放已经被虚拟机加载类型的相关信息,类信息:类名,访问修饰符,方法描述,运行时常量池,静态变量。
特点是:线程共享,内存的回收效率低,信息一般长期存在。
1.6 JVM调优的三大参数
- -Xss:规定了每个线程虚拟机栈的大小(影响并发线程数大小)
- -Xms:堆大小的初始值(超过初始值会扩容到最大值)
- -Xmx:堆大小的最大值(通常初始值和最大值一样,因为扩容会导致内存抖动,影响程序运行稳定性)
1.7 Jvm中堆和栈的区别
管理方式:栈时自动释放,堆需要GC
效率:栈的效率比堆高
空间大小:栈比堆小
1.8 类记载的过程
通过ClassLoader加载Class文件字节码,生成Class对象,然后进行链接
校验:检查加载到Class的正确性和安全性
准备:为类变量分配存储空间并设置类变量初始值
解析:JVM将常量池内的符号引用转换为直接引用
之后进行初始化:执行变量赋值和静态代码块。
双亲委派机制
什么是双亲委派机制
当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。
为什么要使用双亲委派机制
防止重复加载同一个.class文件,通过委托去向上级问,加载过了就不用加载了。
保证核心.class文件不会被串改,即使篡改也不会加载,即使加载也不会是同一个对象,因为不同加载器加载同一个.class文件也不是同一个class对象,从而保证了class执行安全
1.9反射机制
定义:反射是java运行时自我观察的能力,通过class,fileld,constructor,method获取类的各个组成部分。
场景:第三方应用开发过程中,会需要某个类的某个成员变量,方法或者是属性私有的或者只对系统应用开发,就可以通过反射机制来获取所需的私有成员或者方法。