01-学习大纲
02-体系结构

作业:JVM画图
https://www.cnblogs.com/liululee/archive/2019/09/04/11461998.html

03-类加载器及双亲委派机制

类加载器画图:虚拟机自带加载器-启动类/根加载器/扩展类加载器/应用程序加载器
百度双亲委派机制
APP-Exr-rt -EXR-APP
Java=c+±-,去掉了指针和内存管理,native本地c++方法

04-沙箱安全机制
05-Native、方法区

计数器

06-栈

栈:数据结构;先进后出
队列:先进先出(FIFO)
main()先执行后结束——在栈中执行
栈:又称栈内存,主管程序的运行;生命周期和线程同步;线程结束,栈内存释放,不存在垃圾回收。
栈中存放:8大基本类型+对象引用+实例方法
栈的运行原理:栈满了StackOverflowError

07-HotSpot和堆

三种JVM

  • Sun公司:HotSpot
  • BEA:JRockit
  • IBM:J9 VM
    堆 heap,一个JVM只有一个堆,堆内存的大小是可以调节的
    类加载器读取了类文件后,一般会把类,方法,常量,变量,保存所有引用类型的真实对象放到堆中。
    垃圾回收:轻量级GC,重量级GC(Full GC)
    堆内存分为三个区域:新生区(伊甸园区Eden Space;幸存0区,幸存1区)、养老区、永久存储区。
    GC垃圾回收,主要在伊甸园区和养老区
    假设内存满了OOM,java.lang.OutOfMemoryError
    在JDK8以后,永久存储区叫元空间
08-新生区、永久存储区、堆内存调优
  • 新生区、类诞生和成长的地方,甚至死亡;经过研究,99%的对象都是临时对象
    • 伊甸园区Eden Space:所有对象都在伊甸园区new出来
    • 幸存0区
    • 幸存1区
  • 养老区Old:杀不死的
  • 永久存储区Perm:这个区域是常驻内存的,用于存放JDK自身携带的class对象,Interface元数据,存储的是Java运行时的一些环境。这个区域不存在垃圾回收,关闭虚拟机就会释放这个区域的内存。
  • 一个启动类加载了大量的第三方jar包;tomcat部署了大量的应用;大量动态生成的反射类;不断地被加载,直到内存满,会导致这个区域崩溃,出现OOM
    -jdk1.6之前:永久代,常量池在方法区之中
    -jdk1.7:永久代,但是慢慢的退化了,去永久代,常量池在堆中
    -jdk1.8:无永久代,常量池在元空间(方法区/非堆)
    默认的情况下:分配的总内存 是电脑内存的1/4;而初始化的内存:1/64
    ? -Xms1024m -Xmx1024m -XX:+PrintGCDetails
    参数调优
09-JPofiler工具分析OOM原因

内存快照分析工具:MAT(Eclipse:https://www.jianshu.com/p/d8e247b1e7b2),JPofiler
-分析Dump内存文件,快速定位内存泄漏
-获得堆中的数据
-获得大的对象
-。。。
待看*

10-GC介绍之引用计数法

JVM在进行GC时,并不是对这三个区域统一回收,大部分时候,回收都是新生代。
轻GC:普通的GC
重GC:全局的GC
标记清除法,标记压缩,复制算法,
引用计数器:每个对象都记录使用次数,清除使用次数为零的算法。微软,python,

11-GC之复制算法

谁空谁是to
1。每次GC都会将Eden活得对象移到幸存区中,一旦Eden区被GC后,就会是空的。
2.如果空的相等,就把from移动到to,
当一个对象经历了15(-XX:MaxTenuringThreshold)次GC,都还没有死,进入老年代
年轻代主要使用复制算法。
好处:没有碎片
坏处:浪费内存空间,多了一半空间是空的,极端下,对象百分百存活,操作移动复杂

12-标记压缩清楚算法

1.扫描对象,对活着的对象标记
2. 清除:对没有标记的对象进行清除
优点:不需要额外空间
缺点:两次扫描浪费时间,会产生内存碎片。
3.再优化:压缩
防止内存碎片产生,再次扫描,向一端移动存活的对象
标记清除压缩:先标记清除几次再压缩

13-总结

内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)
内存整齐度:复制算法=标记清除算法>标记压缩算法
内存利用率:标记压缩算法=标记清除算法>复制算法

GC:分代收集算法
年轻代:存活率低-复制算法
老年代:区域大,存活率高-标记清除(内存碎片不是太多)+标记压缩

《深入理解JVM》

14-JMM

什么是JMM:百度
https://www.cnblogs.com/zhengbin/p/5654805.html
它干嘛的:官方,其他人博客,视频
它该如何去学习

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐