1.jvm类加载时机
1.遇到new,getstatic,putstatic或者invokestatic这字节码指令时,会先触发初始化
- new new实例化对象
- getstatic 读取一个类的静态字段(使用static final修饰的除外)
- setstatic 设置一个类的静态字段(使用static final修饰的除外)
- invokestatic 调用一个类的静态方法
2.当初始化一个类的时候,如果其父类没有进行初始化,则会触发其父类的初始化
3.第一个要执行的主类(包含main方法的类)
4.使用java.lang.reflect 方法对类进行反射调用的时候,
1.1不会初始化的例子
- 通过子类引用父类的静态字段
- 通过数组定义来的引用类
- 调用类的常量(使用static final修饰)
2.内存分配策略
- 优先分配到eden区域
- 大对象(超出eden最大内存)直接分配到老年区
- 长期存活的对象分配到老年代
- 空间间分配担保(当eden内存空间不足时,会向老年代借空间)
- 动态对象年龄判断(每经历一次gc垃圾回收,年龄+1)
jvm自带调优
- jps java process status (查看java运行的基本参数)
- jstat查看类装载,内存,垃圾收集,jit编译的信息
- jinfo 实时查看和调整jvm的各项参数
- jstack查看线程的各项参数