熟GC常见算法,熟悉常见的垃圾收集器,具有实际JVM调优实战经验
java程序开始执行,会有一个栈产生,一个线程一个栈。一个方法对应一个栈帧
堆空间是在程序运行的时候动态分配的一个空间
栈空间自动释放,堆空间涉及释放问题
野指针:
--同一个对象,两个指针,一个释放了,一个不知道还拿来用
--同一个指针,不同位置
--不再指向任何对象的指针
--NullPointerExcetion
并发问题:
--多线程访问同一块儿内存空间
语言的发展历史
c/c++
--手工管理内存
--忘记释放 内存泄漏 memory leak
--释放多次 产生极其难以调试的bug,一个线程空间莫名其妙被另外一个释放了
--开发效率很低
java Python go js kotlin scala
--方便内存管理的语言
--GC Garbage Collector 垃圾回收机制 应用线程只管分配,垃圾回收器负责回收
--大大降低了程序员门槛
rust
--运行效率超高(对标 c c++)
--不用手工管理内存(没有GC)
--学习曲线巨高(所有权 任何一个值任何时候都只归属一个变量 变量有且只有一个)
--你只要程序语法通过,就不会有bug
什么是垃圾:当没有引用指向时
垃圾回收算法:
mark-sweep:标记清除法 碎片化
copying:负责法 浪费空间
mark-compact:标记整理法 效率偏低
分代模型
新生代:刚刚诞生的对象,更新频繁,复制算法,老年代:标记清除,或标记整理或者混合使用
G1前都是分代,G1后都是分区
cms 并发的标记清除
CMS:
初始标记:STW 找root标记
并发标记:会有错标 三色标记算法(golang)
重新标记:STW
并发清理: