1.内存分配:
a.优先在新生代Eden区分配.Eden区没有足够的空间时,虚拟机发起一次Minor GC.
(Major GC 是清理永久代。Minor GC 会清理年轻代的内存,Full GC 是清理整个堆空间—包括年轻代和永久代)
b.大对象(需要大量连续内存空间的Java对象)直接进入老年代,避免大对象的复制.如很长的字符串或大数组.应该避免短命大对象的使用
c.长期存活的对象将进入老年代.虚拟机给 每个对象定义一个对象年龄计数器.熬过一次Minor GC,计数器+1(默认15)进入老年代
d.动态对象年龄判定:Survivor中年龄相同的对象,总大小大于Survivor的一半,所有大于等于该年龄的对象,直接进入老年代
(HotSpot年轻代分三个区Eden,两个Survivor)[大小比8:1]
2.类加载的时机:
类加载的时机虚拟机规范没有强制规定,看虚拟机自己具体实现.但规定了以下几种情况必须初始化(加载验证准备必须在此之前)
a.new实例化对象,使用一个类的静态字段(被final修饰,编译期放入常量池中的静态字段除外),使用类的静态方法
b.使用java.lang.reflect包的方法对类进行反射调用的时候
c.初始化一个类的时候,发现其父类没有初始化,会先触发父类的初始化
d.虚拟机启动时,用户指定要执行的主类(含有main方法的类),会触发虚拟机初始化这个主类
e.
3.类加载器
启动类加载器(Bootstrap ClassLoader)加载<java_home>/lib下的能被虚拟机识别的类,不能被Java程序直接引用
扩展类加载器(Extension ClassLoader)加载<java_home>/lib/ext中的类.可以被程序员直接使用
应用类加载器(Application ClassLoader)(系统类加载器)加载用户路径(ClassPath)上的类库
自定义类加载器(可以自己实现)
当一个类需要加载时,先检查是否加载过,若没有先由启动类加载器加载,没有此类的话,由扩展类加载器加载,最后由应用类加载器加载,防止了重复加载