2023-07-12 星环科技 大数据面经实操

讲一下 JVM 的垃圾回收的相关概念?

Java虚拟机(JVM)的垃圾回收(Garbage Collection,GC)是Java内存管理的一个重要部分,它负责自动化地管理Java程序的内存,通过识别和回收不再使用的对象来释放内存。垃圾回收器在程序运行时进行,尽管开发者无法直接控制其精确的运行时间,但可以通过编写“内存友好”的代码以及调整JVM配置参数来影响其行为。

以下是关于JVM垃圾回收的一些基本概念:

对象的生命周期:Java对象的生命周期开始于创建(当使用new关键字时)并在不再有引用指向它们时结束。如果一个对象不再被引用,那么它就可能被垃圾回收。

堆(Heap)内存:Java对象存储在堆内存中。堆在JVM启动时创建,可以通过JVM参数调整其大小。

垃圾回收算法:垃圾回收器使用特定的算法来确定哪些对象可以被视为"垃圾"并进行回收。常见的垃圾回收算法有标记-清除(Mark-and-Sweep)、标记-压缩(Mark-and-Compact)、复制(Copying)、以及分代回收(Generational Collection)等。

停顿时间(Stop-the-world):垃圾回收器在运行时,通常会导致Java应用程序的执行暂停,这种现象被称为“停顿时间”。减少停顿时间是垃圾回收器优化的一个重要目标。

分代回收:Java的垃圾回收器通常采用分代回收策略,将堆内存分为新生代(Young Generation)和老年代(Old Generation)。这种策略基于这样一个观察:大多数对象的生命周期都很短。

新生代(Young Generation):新创建的对象首先放在新生代。新生代通常分为一个Eden区和两个Survivor区(S0和S1)。大部分对象在Eden区被垃圾回收。

老年代(Old Generation):如果对象在新生代中存活了足够长的时间,它们会被移动到老年代。老年代的空间通常比新生代大,并且其垃圾回收频率较低。

垃圾回收器(GC Collectors):Java提供了多种垃圾回收器,包括Serial、Parallel、CMS(Concurrent Mark Sweep)、G1(Garbage-First)以及ZGC(Z Garbage Collector)等。每种垃圾回收器都有其特定的使用场景和优劣,选择哪种垃圾回收器取决于具体的应用需求。

JVM 常见调优方法有哪些?

内存分配:扩大JVM堆的大小可以提供更多的空间给对象,减少垃圾回收(GC)的次数。使用-Xms和-Xmx参数可以分别设置堆的初始大小和最大大小。然而,分配过多的内存可能会导致更长的GC停顿时间,并可能影响其他进程的性能。

选择垃圾回收器:根据应用的需求和特性选择合适的垃圾回收器。例如,对于需要低延迟的实时系统,选择并发垃圾回收器(如CMS或G1)可能是个好选择。对于可以容忍更长GC停顿时间的批处理任务,使用并行垃圾回收器(Parallel GC)可能更为合适。

调整新生代和老年代的比例:JVM的堆内存被划分为新生代和老年代,其中新生代通常分为Eden区和两个Survivor区(S0和S1)。这些区域的大小可以通过参数-XX:NewRatio,-XX:SurvivorRatio进行调整。这种调整可以根据应用的对象生命周期进行,以减少GC的次数。

调整线程堆栈大小:使用-Xss参数可以设置每个线程的堆栈大小。如果应用创建了大量的线程,减小线程堆栈大小可能会帮助减少内存消耗。

启用类数据共享:类数据共享(Class Data Sharing, CDS)可以加快JVM启动速度并减少内存消耗。可以通过-XX:+UseSharedSpaces参数启用CDS。

使用JVM内建工具进行监控和故障排查:JVM提供了一些内建工具,如JConsole, VisualVM, jstat等,可以用于监控JVM的性能和资源使用情况,帮助定位和解决性能问题。

讲一下 ElasticSearch 的基本结构、索引和分片

Elasticsearch 结构

Elasticsearch 是一个开源的搜索引擎,基于 Apache Lucene 构建,它可以提供全文搜索功能,具有 HTTP web 接口和无模式 JSON 文档。Elasticsearch 能够处理大量数据,并且能在实时条件下提供搜索和分析功能。它的体系结构主要包括以下几个层次:

集群 (Cluster):Elasticsearch 能够将多个服务器组织在一起,形成一个集群。集群能共享负载,提供冗余,从而提供高可靠性。

节点 (Node):节点是集群中的一个服务器,负责存储数据,参与集群的索引和搜索功能。

索引 (Index):索引是一种类似于数据库的数据结构,用于存储在 Elasticsearch 中的文档。

文档 (Document):文档是 Elasticsearch 中存储的基本信息单位,类似于数据库中的一行数据。

分片 (Shard):每个索引都会分成多个分片,每个分片是一个独立的 "索引",可以被分配到集群中的任何节点。

副本 (Replica):为了提高系统的容错性,Elasticsearch 会创建分片的副本。

Elasticsearch 索引

索引是 Elasticsearch 中用于存储类似类型文档的地方。比如说,你可以有一个客户的索引 (customer),另一个订单的索引 (order)。一个索引由一个或多个称为 shards 的物理分区组成。每个分片都是一个自包含的索引,可以在 Elasticsearch 集群中的任何节点上托管。

Elasticsearch 集群和分片

在 Elasticsearch 中,集群是由一个或多个节点组成的,能够共同执行数据索引、搜索和分析的服务器组。每个节点都知道所有其他节点的存在,并且可以直接与任何其他节点通信。

分片是 Elasticsearch 进行数据分片的方式,每个索引可以被分割成多个分片。每个分片都是一个完全独立的索引,可以在集群中的任何节点上托管。分片的主要优点是,它们允许你水平地拆分和扩展你的数据量,并且分片可以在多个节点之间分配,这有助于提高性能和吞吐量。

redis 的数据结构有哪些 ?

字符串(String):字符串是 Redis 最基本的数据类型,你可以理解成与 Memcached 一样的功能,一个 key 对应一个 value。这个字符串类型是二进制安全的。意思是 Redis 的 string 可以包含任何数据,比如 jpg 图片或者序列化的对象。

哈希(Hash):这是一个键值对集,Hash 是一个 string 类型的 field 和 value 的映射表,特别适合用于存储对象。

列表(List):Redis 列表是简单的字符串列表,按插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

集合(Set):Set 是 string 类型的无序集合。和列表一样,你也可以添加、删除单个元素。但是,它保证存储的每个 string 都是唯一的。

有序集合(Sorted Set):有序集合和普通集合一样也是 string 的集合, 同时又是每个元素都会关联一个 double 类型的分数。Redis 通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的, 但分数(score)却可以重复。

位图(Bitmaps):实际上是字符串的一种特殊类型。通过特殊的命令,你可以设置字符串中的某个位(bit),或者获取该位的值。

HyperLogLogs:这是一种用来统计唯一值(如一个网站的每日独立访客数)的数据结构。尽管它只使用了极小的内存,但是它可以统计几亿个对象。

地理空间索引(Geo):你可以将地理位置(如经纬度)添加到这种数据结构中,然后在此基础上进行各种地理空间相关的操作。

MySQL MVCC 的原理

在 MySQL 中,MVCC 是一种多版本并发控制(Multi-Version Concurrency Control)的机制。MVCC 主要用于实现数据库的事务(Transaction)、并发控制(Concurrency Control),以及读一致性(Read Consistency)。

MVCC 主要在 InnoDB 存储引擎中实现,通过在每行记录后面保存两个隐藏的列来实现。这两个隐藏的列分别是:

  1. 创建版本号(CREATION)
  2. 删除版本号(DELETION)

当开始一个新的事务时,事务版本号会自动递增。这两个隐藏列的值会被设置为当前的事务版本号。这意味着在同一时间可以有多个版本的行存在,每个版本都对应一个或多个指定的事务。

对于任何特定的 SQL 查询,MVCC 会返回所有满足下列条件的行:

行的创建版本号小于或等于事务版本号。

行的删除版本号要么未定义,要么大于事务版本号。

这就意味着,每个事务会看到一个它开始时的数据库快照,因此可以实现非锁定读(Non-Locking Reads),也就是读一致性。

MVCC 的主要优点是它允许数据库进行更高的并发操作。因为读操作和写操作不会互相阻塞,所以可以大大提高数据库的性能。然而,MVCC 也有其缺点,例如它需要更多的磁盘空间来存储多个版本的行,并且对于大量的更新操作,可能需要更多的 CPU 和 I/O 资源来清理旧的行版本。

#大数据##Java##面试##面经##互联网#

解决职场真实面试问题,分享同学真实成功案例,欢迎订阅关注!

全部评论
我还能干这行吗,我都不会欸
点赞 回复 分享
发布于 2023-10-12 09:44 河北

相关推荐

点赞 评论 收藏
分享
1. 自我介绍2. 项目介绍3. 项目排查思路4. 功能测试需要注意的点5. 说一下你做压测的流程6. 测试期间用到了哪些工具7. Linux系统中去查看内存的命令8. 刚才你有说性能优化排查,那么有一个常见的思路就是去看一下JVM里面的GC情况(这块真慌了,因为我在项目中基本上只考虑到了MySQL的一些排查优化,没考虑JVM,所以说下面JVM相关的东西基本上是乱答了)你先说一下在项目调优过程中会用到的命令,比如说想看一下JVM中的一个GC的情况这样9. jstat和jmap的区别10. jmap有没有了解11. 查看GC情况可以用到哪些工具(这里面试官应该是希望我用过VisualVM)12. 怎么去查看日志,可以用什么工具13. 有没有做数据分片?14. 我见你项目中都用到了Redis,问一下你在Redis中都去存放了什么数据15. 比如说有一个排行榜的功能,你会用什么Redis数据类型16. 你知道有序集合的底层实现吗17. 比如说现在有一个top10的一个界面实现,体现在代码层面上,你是会先自己进行一个排序,然后塞到10这个框内,还是说会在10的里面不断进行动态排序呢?18. 我见你还做了一个电商的项目,你的项目中有热key这个问题吗19. 大概是一种什么现象,会带来哪些问题20. 怎么去解决热Key问题(我的回答偏向于缓存方面,面试官更希望是分片集群方面)21. 我见你其实在简历上说自己考虑到了这个主从模式了,能说一下具体怎么做的吗,怎么去考虑负载均衡这个问题22. 有了解集群模式吗23. 你在做测试的时候是在做黑盒测试还是白盒测试24. 测试过程中是测试单个接口还是说去测试整个链路(分情况考虑)25. 如果是整个链路的测试,你可能会关注哪方面,性能还是什么?26. 你这个是一个Java项目嘛,想知道一下你们在做测试的时候,怎么去看测试日志,是自己做了一个日志系统还是说去后端服务器上看27. Java日志的存放位置28. 查看日志怎么去看(想考察一下tail,less等以及grep、awk、sed这些命令的使用)29. 给一个场景:有一个功能测试的场景,在发起一个请求之后,发现这个接口特别的慢,在一个真实的线上系统中,我们的项目并不是依靠单一的服务,而是依靠层层依赖的微服务去实现的(这里吓懵逼了,没学过微服务)调用的接口不止是线上看到的那一个,底层可能调用到了很多接口,这个时候要怎么去排查解决慢接口问题30. 接口有时候传递参数是动态的,底层的业务逻辑可能会很复杂,有的时候你换了个参数,这个接口的反馈速度就不同了,现在你想查一下这个请求到底干了什么事情,链路到底是怎么实现的,你会去怎么分析31. 出了一个MySQL语句,用到了索引和分页,问这个语句在执行器中的执行顺序、有没有用到索引、用到的是哪个索引、这个索引为这个语句返回了什么内容、异步之后执行了什么操作、最终为我们返回的是什么(面试的时候一直没听懂面试官想问我什么,再加上自己确实平常只是用MySQL索引,并没有关注索引到底为数据库返回了什么数据,后来反问阶段问了一下这个题,面试官希望我从索引的数据结构,也就是根节点叶子节点层面上去考虑这个题)32. 大三课业情况以及实习时间33. 反问#牛客激励计划##牛客创作赏金赛#
查看33道真题和解析 牛客激励计划 牛客创作赏金赛
点赞 评论 收藏
分享
评论
6
34
分享

创作者周榜

更多
牛客网
牛客企业服务