架构师训练营——第 9 周学习总结
JVM 虚拟机原理
JVM 组成架构
Java 是一种跨平台的语言,JVM 屏蔽了底层系统的不同,为 Java 字节码文件构造了一个统一的运行环境。
JVM 核心组成部分:
类加载器
运行期数据区
方法区 - 所有线程共享区域
堆 - 所有线程共享区域
Java 栈 - 每个线程独享
程序计数寄存器 - 每个线程独享
执行引擎
线程工作内存 & volatile
线程操作主内存变量,需要通过线程独有的工作内存拷贝主内存变量副本来进行。
一个共享变量被 volatile 修饰之后,保证了不同对这个变量进行操作时的可见性。
JVM 垃圾回收
JVM 垃圾回收就是在 JVM 堆中的已经不在被使用的对象清理掉,释放内存资源;
JVM 通过一种可达性分析算法进行垃圾对象的识别,对被引用的对象进行标记,那些没有标记的对象就是可回收的垃圾对象了。
JVM 回收垃圾对象占用的资源主要有 3 种方法:1.清理 2.压缩 3.复制
JVM 在具体垃圾回收时会进行分代垃圾回收。具体实现:JVM 将堆空间分成新生代和老年代两个区,新建的对象都存放在新生代,当新生代空间不足时,只对新生代进行垃圾回收,这样需要处理的内存空间就比较小,垃圾回收速度就比较快。
采用串行、并行、并发或 G1 等算法对内存进行回收,在回收过程中会产生 STW(Stop The World)现象。
JVM 性能诊断工具
基本工具:JPS、JSTAT、JMAP、JSTACK
集成工具:JConsole、JVisualVM
Java 代码优化
合理并谨慎使用对线程
竞态条件和临界区
Java 线程安全
Java 内存泄漏
如果程序保留对永远不再使用的对象的引用,这些对象将会占用并耗尽内存
合理使用线程池和对象池
使用合适的 JDK 容器类
缩短对象生命周期,加速垃圾回收
使用 I/O buffer 及 NIO
优先使用组合代替继承
合理使用单例模式
计算机的任何问题都可以通过虚拟层(或者中间层)解决
评论