

自己总结:菜鸟浅谈JVM和GC回收过程
JVM内存结构:分为三大主要区域:类加载子系统区,Java运行时数据区,执行引擎。读取数据的过程:首先操作系统通过IO流去读取文件,类加载子系统负责基于IO流把磁盘,网络,堆内存中文件(.class文件,也就是类的字节码文件)读取到JVM的方法区(method area)也可以说是元数据区(meat space),然后并基于类的字节码文件构建实例对象,再通过线程去启动方法,线程调用方法并执行,通过线程调用的方法会进入到Java的方法栈中,方法结束以后出栈,再由执行引擎把16进制的字节码文件转换成2进制的内容,再交给CPU去处理并执行。
GC回收过程:首先GC内部有自己的算法,会不定期的对对象进行可达性分析,如果对象不可达了(也可以理解为没有引用再指向这个对象了),那么根据GC自己的算法(标记清除整理法),标记对象,然后进行清除,最后在整理堆内存。那么在这个过程中会有一些已经没有引用的小对象逃逸到栈中,GC第一次对堆内存(年轻代和老年代,年轻代又分为伊甸园区和from to 两个幸存区)清除的过程中大的对象直接进入老年代,小的对象有可能没有被清除干净会进入年轻代的伊甸园区,第二次再清除如果还有没被清除干净的进入幸存区1 from,第三次从from 到 to,第四次从to 又到from,这样周而复始多次,始终没有被清除,那就进入老年代,等到这种情况越来越多,老年代也存满了,那么就会出现内存泄露,内存泄露会导致内存溢出,这是程序设计过程中最最应该避免的,也是我们程序猿的敌人,所以说我们在设计程序的过程中应该尽量去避免使用强引用,而选择弱引用和软饮用,这样对于GC是最友好的,同时对于一些占用内存大,但是使用利率不高的大对象,我们可以设计为延迟加载(又叫懒加载),再需要使用的时候再让JVM去加载,而不是在第一次加载时就把它加载到内存中,这样的设计也能够让我们的程序更加的稳定且强壮。