第九周课程总结

用户头像
考尔菲德
关注
发布于: 2020 年 08 月 05 日

一、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架构



用户头像

考尔菲德

关注

还未添加个人签名 2018.04.19 加入

还未添加个人简介

评论

发布
暂无评论
第九周课程总结