第九周课程总结
一、JVM虚拟机原理
1、JVM组成架构
Java是一种跨平台的语言,JVM屏蔽了底层系统的不同,为了Java字节码文件构造了一个统一的运行环境
2、Java字节码文件
1)计算机领域的任何问题都可以通过增加一个中间层(虚拟机)来解决
在代码的执行过程中,JVM将字节码解释执行,屏蔽对底层操作系统的依赖
解释执行 — 在读指令的时候,同时进行执行
编译执行 — 对于热点代码会通过JIT动态编译为机器码,提供执行效率
2)具体的字节码执行流程如下:
3、类加载器的双亲委托模型
1)定义
底层的当前类加载器,不能覆盖更高层次类加载器已经加载的类,如果低层次的类加载器想加载一个未知类,需要上级类加载器确认,只有当上级类加载器没有加载这个类,也允许加载的时候,才让当前类加载器加载这个未知类
2)自定义类加载器
隔离加载类 — 同一个JVM中不同组件加载同一个类的不同版本
扩展加载源 — 从网路、数据库等处加载字节码
字节码加密 — 加载自定义的加密字节码,在ClassLoader中解密
4、堆&栈
5、方法区&程序计数器
6、线程工作内存&volatile
7、JVM的垃圾回收
1)如何识别回收对象
可达性分析算法进行垃圾对象的识别
2)回收的方式:
清理
压缩
复制
3)JVM分代垃圾回收
新生代 — Eden区、From区和To区 这三个区域之间是如何配合工作
老年代
4)JVM垃圾回收期算法 — 一个或多个线程负责
串行回收器(Serial GC) — 启动一个线程进行回收, stop-the-world,早期计算器是单CPU单核机器的,所以反而单线程效率更高
并行回收器(Parallel GC) — 启动多个垃圾回收线程并行进行回收,但是在这个时间内还是stop-the-world
并发回收器CMS(Concurrent mask Sweep)
单线程初始化标记 — stop-the-world,只标记第一级对象,速度很快
G1回收器(garbage-first)
8、JVM启动参数
1)标准参数
2)非标准参数
3)非Stable参数
9、JVM性能诊断工具
1)基本工具
JPS
JSTAT
JMAP
JSTACK — 可查看jvm内的线程堆栈信息
2)集成工具
JConsole
JVisualVM
二、Java代码优化
1、合理并谨慎使用多线程
启动的线程数 =【任务执行时间/(任务执行时间-IO等待时间)】 * CPU内核数
这个公式达到的目的是保证CPU内核数被100%的使用
2、竞态条件与临界区
3、Java线程安全 — 允许被多个线程安全执行的代码称作线程安全的代码
1) — 方法局部变量,线程安全
2)— 方法局部的对象引用,不会逃逸出该方法,也是线程安全的
3)— 对象成员变量,允许两个线程同时访问的话,那么就不是线程安全的
4、ThreadLocal的实现原理和使用
5、Java内存泄漏
是由于开发人员的错误引起
如果程序保留着对永远不使用的对象的引用,这些对象将会占用并耗尽内存
长生命周期对象
静态容器
缓存
解决办法:使用“弱引用”
6、合理使用线程池和对象池
复用线程或对象资源
三、秒杀案例分享
四、搜索引擎
1、互联网搜索引擎整体架构
1)爬虫系统架构
2)文档矩阵与倒排索引 — 词频
2、Lucene架构
3、ElasticSearch架构
评论