JVM大致结果:
一.类加载器
1.类加载器收到类加载的请求之后
2.找到当前加载器(AppClassLoader)的父加载器(ExtClassLoader)的父加载器(null,找不到这个加载器因为Java底层用c和c++写的),直到根加载器
3.看是否能找到需要加载的类,如果能找到,加载这个类,找不到就用找子加载器找,直到最底层的加载器找不到或找到需要加载的类
二.native
1.Java底层是用C和C++语言编写的,Java底层要去调用C和C++的库使用native关键字
2.会进入本地方法栈中去调用本地方法接口
三.方法区
静态变量,常量,类信息等存放在方法区中
四.栈
栈:先进后出,后进先出
主线程结束,栈就over,栈不存在垃圾回收问题
存放内容:8大类型+方法+对象引用
五.堆
一个JVM只有一个堆
堆内存满了:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
1.新生区
伊甸园区:所有的对象都是从这new出来的
幸存区(0,1)
2.老年区:从幸存区活下来的对象
3.永久区(元空间):存放Java的运行时的一些环境
4.OOM,内存溢出
默认情况:JVM分配的内存是电脑的1/4,初始化内存是电脑的1/64
当JVM的内存满时内存溢出,解决办法把JVM的内存调大看是否满,
命令(JVM总内存和初始化内存为1024MB):-Xms1024m -Xmx1024m -XX:+PrintGCDetails
内存溢出:
可以使用JProfiler工具进行分析
六.GC
GC的作用区域:方法区,堆
GC分类:轻GC,重GC
堆:伊甸园区,from区,to区,养老区,元空间
注:from和to区可以交换的谁是空的谁是to区
复制算法:在新生区的from区和to区,当GC垃圾回收时,伊甸园区的幸存对象到,to区,那么使用复制算法将from区的内容复制到to区,此时的to区变为from区
标记清除压缩算法:第一次扫描,对对象进行标记;第二次扫描,对没有标记的对象进行清除;第三次扫描,把存活的对象放在一端,为了防止内存碎片化



