0、最常用的JVM参数设置:
-Xms: 初始堆大小,JVM 启动的时候,给定堆空间大小。
-Xmx: 最大堆大小,JVM 运行过程中,如果初始堆空间不足的时候,最大可以扩展到多少。
-Xmn:设置年轻代大小。整个堆大小=年轻代大小+年老代大小+持久代大小。持久代一般固定大小为 64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大, Sun 官方推荐配置为整个堆的 3/8。
-Xss:设置每个线程的 Java 栈大小。JDK5.0 以后每个线程 Java 栈大小为 1M,以前每个线程堆栈大小为 256K。根据应用的线程所需内
一、JVM虚拟机:
1.1、类装载子系统
1.2、运行时数据区(内存模型)
1.2.1、堆
1.2.2、栈(线程)FILO
1.2.2.1、栈帧(方法)
1.2.2.1.1、局部变量表
1.2.2.1.2、操作数栈(存放临时的操作数的内存区域)
1.2.2.1.3、动态链接
1.2.2.1.4、方法出口
1.2.3、本地方法栈
1.2.4、方法区(元空间)
1.2.5、程序计数器
1.3、字节码执行引擎
二、GC Root根节点:线程栈的本地变量、静态变量、本地方法栈的变量等等。 向下搜索引用的对象,都标记为非垃圾变量 分代年龄15进入老年代
三、垃圾回收器
1、串行收集器
Serial + Serial Old
2、并行收集器
Parallel Scavenge + Parallel Old
3、并发收集器
ParNew + CMS + Serial Old
CMS
.1 初始标记(STW)
.2 并发标记
.3 并发预清理
.4 重新标记(STW)
.5 并发清理
.6 重置
G1
.1 初始标记
.2 根分区扫描
.3 并发标记
.4 存活数据计算
.5 重新标记
.6 清除
五、类加载的过程:
1、加载:加载对应的二进制文件,并且在方法区创建对应的数据结构
2、连接:
2.1、验证
2.2、准备:给静态变量赋初始值
2.3、解析:符号引用转换为直接引用
3、初始化:给静态属性赋值
六、动态代理和静态代理,
动态代理:字节码在JVM运行时动态生成而非预存在于class文件中
实现InvocationHandler接口
JDK动态代理实现接口
cglib动态代理继承父类
1、CGLib所创建的动态代理对象在实际运行时候的性能要比JDK动态代理高不少,有研究表明,大概要高10倍;
2、但是CGLib在创建对象的时候所花费的时间却比JDK动态代理要多很多,有研究表明,大概有8倍的差距;
3、因此,对于singleton的代理对象或者具有实例池的代理,因为无需频繁的创建代理对象,所以比较适合采用CGLib动态代理,反正,则比较适用JDK动态代理。
七、JVM中的类的加载器主要有三种:启动类加载器,拓展类加载器,应用类加载器。
启动类加载器(Bootstrap classLoader):又称为引导类加载器,由C++编写,无法通过程序得到。主要负责加载JAVA中的 一些核心类库,主要是位于<JAVA_HOME>/lib/rt.jar中。
拓展类加载器(Extension classLoader):主要加载JAVA中的一些拓展类,位于<JAVA_HOME>/lib/ext中,是启动类加载器 的子类。
应用类加载器(System classLoader): 又称为系统类加载器,主要用于加载CLASSPATH路径下我们自己写的类,是拓展类 加载器的子类。
类加载器的三大特性:委托性、可见性、单一性
八、类初始化的六种情况
当创建某个类的新实例时(如通过new或者反射,克隆,反序列化等)
当调用某个类的静态方法时
当使用某个类或接口的静态字段时
当调用Java API中的某些反射方法时,比如类Class中的方法,或者java.lang.reflect中的类的方法时
当初始化某个子类时
当虚拟机启动某个被标明为启动类的类(即包含main方法的那个类)
九、显式加载和隐式加载
显式
ClassLoader.loadClass(className)
Class.forName(String name,boolean initialize,ClassLoader loader)