JVM专题学习随手笔记

  1. Java命令执行代码的大概流程
  2. 为什么Java是跨平台的编程语言:因为Java应用程序是基于在Java虚拟机运行的,开发的程序不用为不同平台重写或重新编译,不同平台有不同的Java虚拟机。
  3. 类加载机制过程:加载、验证、准备、解析、初始化
  4. 类加载的时机:创建对象时;访问类的静态变量或静态方法时;
  5. 类加载器
  6. 自定义类加载器
  7. 双亲委派机制
  8. 如何打破双亲委派机制
  9. tomcat为什么要打破双亲委派机制
  10. JVM内存模型
  11. STW是什么
  12. jdk1.8元空间代替永久代:因为永久代有空间限制,并且物理内存上和堆连续,如动态生成太多jsp,会oom;而元空间是本地内存,不受空间限制,-XX:MetaspaceSize若超过则会触发GC。
  13. 对象创建过程:类加载检查、分配内存、初始化零值、设置对象头、初始化
  14. 对象的组成结构:对象头(MarkWord+数组长度+类型指针)+实例数据+对其填充
  15. 类型指针、压缩指针
  16. 对象在内存中如何分配
  17. 逃逸分析、标量替换
  18. 对象动态年龄判断:youngGC时,survivor区存活的对象加起来的大小超过survivor区剩余的空间,就会把这些对象,不管多少年龄,都放入到老年代。默认TargetSurvivorRatio为50一般
  19. 触发YoungGC:Eden区内存已满
  20. 触发FullGC:1、进入老年代的对象大小大于老年代可用空间;2、老年代内存达到设定阈值;3、老年代空间担保机制;4、元空间达到设定阈值;5、System.gc()
  21. 什么情况对象进入老年代:1、survivor区不足以存放对象;2、对象达到设定年龄阈值(16);3、动态年龄判断(相同年龄的对象总和大于survivor区一半,则将其对象全部放到老年代);4、大对象
  22. 老年代空间担保机制:youngGc之前判断老年代的可用空间是否小于之前youngGc进入老年代的对象平均大小,若小于则先进行fullGc再youngGc
  23. 无用的对象,可达性分析算法GC
    roots,当对象到GCRoots没有引用链时,表示该对象可被回收;GCRoots:线程栈的局部变量、静态变量、本地方法栈的变量
  24. 无用的类
  25. 强引用、软引用:Oom时被回收、弱引用:每次GC都回收
  26. 垃圾收集算法:标记复制、标记清除、标记整理
  27. 垃圾收集器:Serial、Parallel、ParNew、CMS、G1、ZGC
  28. 垃圾收集器:Serial、SerialOld,都是串行回收,全程都会STW,前者用在新生代,采用复制算法,后者用在老年代,采用标记-整理算法
  29. 垃圾收集器:Parallel Scavenge、ParallelOld,JDK1.8默认垃圾收集器,是Serial多线程版本,并行回收,全程都会STW,前者用在新生代,采用复制算法,后者用在老年代,采用标记-整理算法
  30. 垃圾收集器:ParNew,是Serial多线程版本,并行回收,全程都会STW,用在新生代,采用复制算法。配合CMS使用
  31. 垃圾收集器:CMS:并行收集器,关注的是垃圾回收最短停顿时间,用在老年代,采用标记-清除算法,也可整理,高并发,低停顿。工作步骤:初始标记、并发标记、重新标记、标记清除、并发重置
  32. 垃圾收集器:G1:用在整个堆的并行收集器,采用标记-整理算法,不会产生内存碎片。将堆内存整个区域分成相互独立的块,尽量回收垃圾最大量的区间,所以叫垃圾优先(GarbageFirst)。1.9默认垃圾收集器
  33. 垃圾收集器:ZGC:用于更大的内存回收,T级别,仍处于试验阶段,使用很少。
  34. CMS过程、应用、参数
  35. 三色标记、读写屏障、记忆集与卡表
  36. G1过程、应用、参数
  37. ZGC
  38. JVM优化手段:设置内存大小,调整新生代老年代比例,更换垃圾收集器CMS,打印OOM日志和GC日志、设置CMS的参数
  39. JVM使用命令:jps查看Java进程数和ID;jstat查看垃圾回收情况;jmap生成内存快照;jhat分析内存快照;jstact生成线程快照,解决死锁(jstack-l pid)和cpu飙高问题。
  40. jstack 分析CPU过高步骤:1、top(找到高消耗CPU的线程进程;2、top -Hp pid(找到高消耗CPU的线程);3、jstack pid(Java进程);4、在jstack找到高消耗cpu的线程的执行代码(第二步的线程id从十进制转化成16进制,jstack中的nid为16进制的线程id)
  41. JVM性能调优案例及解决方案
  42. Arthas安装及使用
  43. 四种常量池
  44. 字符串创建过程,intern()
  45. 内存溢出与内存泄漏:
    内存溢出:申请的空间超过系统限制的分配空间,报错OOM,常见的有堆溢出、栈溢出、元空间溢出、无法创建线程。
    内存泄漏:所使用的空间用完之后无法被释放,因为内存资源的有限,内存泄露的累积会导致内存溢出。
    内存泄漏的原因及解决:内存泄漏分很多情况对待:偶发且内存小可忽略,若多次出现,可能是某代码块多次被执行导致累计内存泄漏,尽可能排查到执行的代码。总之内存泄漏视情况而论,或多或少会出现,很难以排查解决。
    内存溢出的原因及解决:堆溢出、栈溢出、元空间溢出、无法创建线程。常见的代码层面上问题:查库量太大;死循环或太多循环或者递归中创建大量对象;使用集合后,集合中有对对象的引用,使用后未清空(比如:若集合是方法中局部变量时,随着线程结束集合被回收;若集合是静态变量,方法执行后,集合内的引用仍存在);内存参数设置问题。
    解决:检查错误日志,定位代码;排查分析代码,找到造成内存溢出的地方;调整JVM内存参数。
  46. JVM调优什么:减少STW,也就是减少GC频率和时间。因为垃圾回收过程中会短暂暂停业务线程
  47. 定位OOM问题:设置参数,发生OOM时生成hprof快照;检查日志;用MAT分析快照文件,关注实例对象的大小和数量
  48. MetaspaceSize,若超过这阈值,会频繁触发FullGC
  49. CMS调优参数:可能未设置-XX:+UseCMSInitiatingOccupancyOnly,导致频繁CMSGC,因为未配置时会动态判断是否要CMSGC,判断逻辑是预测CMSGC时间是否要大于将老年代填满的时间
  50. Java的语言无关性,JVM只识别字节码,Java、JS、Groovy、Kotlin都可编译成字节码
  51. JVM的字节码执行引擎分为字节码解释器(将字节码逐行解释成本地机器指令,这就是Java被其他语言鄙视慢的原因,所以JIT横空出世)和JIT即时编译器
  52. JIT:即时编译器,利用热点探测技术(方法调用计数(10000次)和回边计数(循环,10700))后,将热点代码编译成本地机器指令(0101)并缓存起来,另外JIT还有其他优化手段如方法内联(减少方法间调用,即将方法合并,避免线程栈多分配栈帧,代码规范写小方法体避免大方法即来自于此)、锁消除(判断因不存在线程安全问题将代码中的无用锁消除)、逃逸分析(判断局部变量是否能逃出方法外,不能则可将对象在栈上分配而不再堆分配,再判断对象是否可以标量替换)
  53. 代码热加载与JIT即时编译器无关,热加载实现:利用自定义加载器和反射机制
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值