后端基础

《架构师训练营》之JVM & 搜索引擎

2020-08-07  本文已影响0人  anOnion

极客时间《架构师训练营》第九周学习笔记

JVM

JVM(java 虚拟机)就是一层用软件实现的物理机。Java 当年主打的核心特征就是:Write Once Run Anywhere;通俗来说就是编译器将 Java 文件编译成.class,通过 JVM 加载并执行这些.class文件;这种执行文件放在所有平台的 JVM 上都拥有相同的产出。

JVM 架构

我们先看看 JVM 的整体架构:

JVM架构

如上图所示,JVM 主要由三部分组成:

此外,还有两个 Native 方法相关模块:

性能工具

Java 代码优化

线程安全

线程安全问题:在多个线程并发环境下,多个线程共同访问同一共享内存资源时,在其中一个线程对资源进行写操作的途中,其他线程对这个写了一半的资源进⾏了读操作,或者对这个写了一半的资源进⾏了写操作,最后导致此资源出现数据错误的情况。

Java 提供了一系列的关键字和类来保证线程安全:

内存泄漏

内存泄漏:当应用程序不再使用对象时发生的情况,但是垃圾回收器无法将其从工作内存中删除,因为它们仍在被引用。因此,应用程序会消耗越来越多的资源,最终导致致命的 OutOfMemoryError。

从下图可以看到,GC 可达性标记后,所有引用被分为两种:引用和未引用。垃圾回收器只会删除未被引用的对象;有些对象出于某些原因不再被应用程序使用,但依旧被可达性标记了,这时 GC 将不会去回收这部分内存。

内存泄漏

列举几个常见的 Java 内存泄漏场景:

查找泄漏:

其他

搜索引擎

Inverted index(倒排索引)

倒排索引,也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。

一般数据库通常基于 Forward Index,即以文档 ID 作为索引,以文档内容作为记录。而 Inverted index 指的是将单词或记录作为索引,将文档 ID 作为记录,这样便可以方便地通过单词或记录查找到其所在的文档。

倒排索引

Lucene 架构

Lucene 是一套用于全文检索和搜索的开放源码程序库,由 Apache 软件基金会支持和提供。Lucene 提供了一个简单却强大的应用程序接口,能够做全文索引和搜索。

Lucene

ElasticSearch 架构

Elasticsearch 是一个基于 Lucene 库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,具有 HTTP Web 接口和无模式 JSON 文档。

Elasticsearch 是分布式的,这意味着索引可以被分成分片,每个分片可以有 0 个或多个副本。每个节点托管一个或多个分片,并充当协调器将操作委托给正确的分片。再平衡和路由是自动完成的。相关数据通常存储在同一个索引中,该索引由一个或多个主分片和零个或多个复制分片组成。

ElasticSearch

秒杀系统

见作业第二题

小结

这周的重点是 JVM 相关,说实在我已经好久没写过 Java 了,当年看到 JVM 调优就头晕。回想起来还是畏缩情绪作怪,根本就没学过相关知识就被吓退了。幸好这章有操作系统的线程知识做铺垫,JVM 架构触类旁通,也很快理解了。现在想想,科班知识才是一切技术基础,重中之重,只可惜当年没有悟到。

上一篇下一篇

猜你喜欢

热点阅读