JVM概括
JVM的主要职责就是从持久化存储上(一般指的是硬盘),加载,识别,解析,存储类文件,并且可以正确的运行这些类文件,还可以有效管理类代码执行过程中的内存管理。
GC
主要职责:管理内存的分配,管理内存的回收
GC回收以对象为单位进行回收,一个对象要存在就完整存在,要释放就完整释放
垃圾回收主要回收堆区
内存划分为 堆区,栈区,方法区,pc, 常量池
关于pc,栈区----->主要和线程挂钩,线程在,这块内存就一定有用,不能回收,反之回收
关于方法区和常量池:可以别gc管理,但是性价比不高,类信息加载到内存中后,很少失去作用,很少被回收,常量池也同理。
1.判断哪些内存可以回收,哪些不可以------------判断谁是垃圾
-
引用计数法 每个对象设置一个计数器,创建一个引用 计数器+1,销毁一个引用 计数器-1,如果计数器==0 则代表它是垃圾了。
但是不能解决循环引用的情况
-
可达性分析法
这部分引用/对象 称为GC Roots ----------->GC过程中可达性分析 遍历的图的根部们
可达性分析就是 从所有的GC Roots开始是遍历图,被遍历到的结点标记为活着的,整个过程 没有遍历到的结点就是死得。
细节:如果在GC过程中 可达性分析之中,后,对象的引用关系发生了变化,造成对象回收错误
所以通常在GC过程中,会停止应用线程的执行。(STW)
2.释放要回收的内存,同时尽可能保障,之后的申请比较容易
-
标记-清除算法
把垃圾标记起来,GC的时候统一清除, 这样会造成内存产生内存碎片,不利于内存的利用
为了清除后的内存具有条理,就有下面方法 -
标记-整理算法
虽然不会产生内存碎片,但是时间消耗大 -
标记–复制
将内存分为相等的两部分,只能用一部分, 把活着的对象复制到另一边,
缺点:每次只能用内存的一边适用范围:大部分的对象都要死