Week9 学习总结
一、JVM架构
二、Java程序运行的过程
1、总体执行流程
2、字节码文件
1)字节码的作用:
a. 类似于在操作系统指令之上建立了一个中间层,一个与具体操作系统的无关的操作指令层
b. 使Java语言能够跨 操作系统、跨平台运行
c. "计算机领域的任何问题都可以通过增加一个中间层(虚拟层)来解决"
2)字节码文件的编程过程
3)字节码文件的格式
3、字节码文件的执行
1)字节码文件的加载
a. 双亲委派机制
b. ClassLoader的加载过程:ApplicationClassLoader(加载classpath下的文件)->PlatformClassLoader(加载jre/lib/ext/*.jar等)->BootstrapClassLoader(加载jire/lib/rt.jar等)
c. 自定义ClassLoader:隔离加载类、扩展加载源、字节码加密
2) 字节码的执行
a. 解释执行
b. JIT--热点代码的编译执行(JVM参数)
4、字节码指令在JVM中的执行过程
1)JVM内存区域的划分
a. 程序计数器
b. 方法区
c. 栈区:虚拟机栈+本地方法栈
d. 堆区
e. 直接内存
2)具体执行过程
5、JVM内存模型--JMM
1)解决的问题:多线程场景下,线程访问共享变量的问题
2)volatile关键字
a. 保证了多线程环境下,共享变量的可见性,但并不能解决并发行问题
b. 禁止指令重排序
三、JVM垃圾回收
1、如何判断对象是否可回收
1)引用计数器
2)可达性分析算法
2、垃圾回收的方法
1)三种回收方法
a. 清除
b. 压缩
c. 复制
2)分代回收
3、垃圾回收过程中内存空间的管理
4、垃圾回收的过程
1)回收算法&垃圾回收器
四、JVM性能调优工具
1、JPS
1)查看所有Java进程的pid
2、JSTAT
1)监控Java程序的资源和性能,如Heap size、垃圾回收情况
3、JMAP
1)输出所有内存中的对象
2)在不同时间执行jmap,并对结果进行对比分析,可以看出GC回收对象的过程
4、JConsole
5、JV isualVM
五、Java代码优化
1、代码中需要注意的点
1)合理使用多线程
a. 启动线程数 = [任务执行时间 /(任务执行时间-IO等待时间)]*CPU核数 = 任务执行时间 / CPU执行时间 * CPU核数
2)注意多线程竞争
3)注意线程安全问题
a. 局部变量: 线程安全
b. 局部的对象引用:对象仅在方法内部,不会发生逃逸时,是线程安全的
c. 成员对象:多线程同时访问是,线程不安全
4)ThreadLocal
5)内存泄漏问题
a. 长生命周期对象引起的内存泄漏
b. 静态容器引起的内存泄漏
c. 缓存引起的内存泄漏
2、优化建议
1)使用池化技术
2)使用合适的数据结构
3)缩短无用对象的生命周期
4)合理的使用IO
5)优先使用组合,而非继承
6)合理使用单例模式
7)使用“中间层”技术
评论