• 1. JVM内存与GC
  • 2. 四个方面内存与GC 编译与执行 并发原理 参数调优
  • 3. 看看 ,JVM在哪J2SE 7 体系
  • 4. 什么是JVM?JVM is Java Virtual Machine 负责执行符合规范的Class文件的虚拟机 JRE is Java Runtime Environment JVM+类库 JDK is Java Development Kit JVM+类库+开发工具
  • 5. 什么是JVM?VM是什么? 可以执行一套指令集的软件 JVM 是一种规范 负责执行符合规范的Class文件的虚拟机 JVM 是一种实现 Sun HotSpot、IBM J9、Oracle JRokit JVM是一个实例
  • 6. JVM的内存分配
  • 7. 程序计数器释义: 字节码的行号指示器 线程私有 只负责java栈,不负责native栈 溢出 唯一一个在JVM specification中没有规定OOM异常的区域
  • 8. JAVA栈释义: 负责方法执行过程 线程私有,每个线程有自己的栈 栈结构
  • 9. JAVA栈溢出 StackOverFlowError OutOfMemoryError 实例
  • 10. 本地方法栈释义: 和java栈一样只不过执行的是本地方法 JVM规范 JVM不限制Native栈的语言、方式、数据结构等等 HotSpot实现 本地方法栈和虚拟机栈合二为一 溢出 StackOverFlowError OutOfMemoryError
  • 11. JAVA堆释义: 分配所有的(绝大部分)对象实例和数组。 GC堆 线程共享 需要线程私有空间怎么办? JVM规范 非连续,可扩展 溢出 OutOfMemoryError
  • 12. JAVA堆实例
  • 13. 方法区释义: 存放Info和常量的地方,类信息、常量、静态变量等 线程共享 JVM规范 作为堆的逻辑部分出现,但却是非堆 不连续、可扩展、无需GC HotSpot实现 永久代 PermGen FGC 溢出 OutOfMemoryError
  • 14. 方法区实例
  • 15. 运行时常量池释义: 方法区的一部分 存放字面量和符号引用 常量不一定在编译期间生成 String#intern() 溢出 OutOfMemoryError
  • 16. 运行时常量池实例
  • 17. 直接内存释义: 对外内存,不在JVM上 HotSpot举例 Native方法分配堆外内存,在堆中保存对堆外内存的引用 -XX:MaxDirectMemorySize 来指定可用大小 溢出 OutOfMemoryError
  • 18. 对象访问实例Object o = new Object();对象被移动时,句柄地址不变 适用于高频率移动对象的场景
  • 19. 对象访问实例Object o = new Object();速度快,节省一次寻址 HotSpot默认使用这种方式进行对象访问
  • 20. GC Garbage Collection哪些是真正的垃圾? 如何回收? 何时回收?
  • 21. 哪些是真正的垃圾?找到垃圾的算法 引用计数器 根搜索 JDK中的垃圾对象判定 引用类别 双重判定 垃圾场 堆 方法区
  • 22. 哪些是真正的垃圾?找到垃圾的算法 引用计数器 为每个实例对象维护一个被引用计数器,当被引用次数为0的时候视为可被回收的垃圾对象。 有何问题? 根搜索 根遍历 GC Root 栈帧的引用 本地方法栈的引用 方法区中的静态变量的引用 方法区中常量的引用
  • 23. 哪些是真正的垃圾?JDK中的垃圾对象判定 引用类别 双重判定 GC找到一个待回收的对象。 有没有重写过finalize()? -> No, 被回收 有没有执行过finalize()? -> yes, 被回收 扔到F-Queue中等待JVM的Finalizer低优线程执行finalize() finalize()中重新建立引用,则不被回收,否则回收掉。强引用java.lang.ref.ReferenceGC不回收软引用java.lang.ref.SoftReference内存不足时,GC回收弱引用java.lang.ref.WeakReferenceGC直接回收虚引用java.lang.ref.PhantomReferenceGC直接回收
  • 24. 如何回收垃圾?——算法标记-清除法(mark-sweep) 标记-整理法(mark-compact) 复制法(copying) 分代收集法(generational collection)
  • 25. 标记-清除法(mark-sweep)存活对象可回收未使用GC前GC后缺点:空间不连续
  • 26. 标记-整理法(mark-compact)存活对象可回收未使用GC前GC后缺点:全扫描+标记+清理+移动 ,成本高
  • 27. 复制法(copying)存活对象可回收未使用不可用GC前GC后缺点:浪费空间
  • 28. 分代收集法(generational collection)新生代:存活率极低——复制算法 老生代:存活率较高——整理标记/清除法
  • 29. 如何回收垃圾?——收集器Serial ParNew Parallel Scavenge Serial Old Parallel Old CMS G1
  • 30. Serial & Serial Old单线程 Stop the world
  • 31. ParNew/Parallel Scavenge & Parallel Old多线程 Stop the world ParNew VS Parallel Scavenge: 吞吐量优先 可控制GC停顿时间 自适应的内存堆栈分配策略
  • 32. Concurrent Mark Sweep初始标记 标记GC Root 能直接关联到的对象实例,速度超快,stop the world 并发标记 GC Root tracing 找出所有需要清理的对象,速度较慢。 重新标记 修正由于用户并发执行导致的新垃圾,速度很快。 并发清理 真正的清理过程,但在这个过程中用户并发的程序依然会产生新垃圾,称为浮动垃圾,可能导致Full GC
  • 33. SpotHot中堆内对象的一生出生 Perm Generation Young generation Eden Survival Old Generation(Tenured ) 死亡
  • 34. 堆内存结构