字节一面面经

Java的优缺点

优点

1.跨平台性

2.自动垃圾回收

3.面向对象

4.成熟的生态、丰富的库和框架

5.支持多线程

缺点

1.运行速度相对于面向过程语言较慢,性能相对较低

2.代码不够简洁

3.GUI外观及体验不佳

怎么理解Java半编译半解释

这是因为 Java 语言既具有编译型语言的特征,也具有解释型语言的特征。因为 Java 程序要经过先编译,后解释两个步骤,由 Java 编写的程序需要先经过编译步骤,生成字节码(.class 文件),这种字节码必须由 Java 解释器来解释执行。

解释执行效率低,有什么优化方式吗

1.即时编译器(JIT)JIT编译器可以识别经常执行的代码片段,并将它们编译成优化的本地机器代码,从而提高执行效率。

2.进行JVM调优,例如调整堆大小、设置垃圾收集器的类型等。

什么是JIT、AOT

T(Just-In-Time)和AOT(Ahead-Of-Time)是两种不同的编译方法,用于将编程语言代码转换为机器码,以便于计算机执行。

JIT(Just-In-Time Compilation)即时编译

JIT编译是一种动态编译技术,它将程序代码在运行时即时编译为机器码。JIT编译器通常与解释器结合使用,解释器负责将字节码转换为机器码,并在执行过程中动态地优化代码。当解释器遇到经常执行的代码片段时,它会将这些代码片段编译为优化的机器码,以提高后续执行的效率。

JIT编译的优点是可以利用运行时信息来生成更高效的机器码,但它需要解释器在运行时进行工作,这可能会带来一些性能开销。

AOT(Ahead-Of-Time Compilation)预先编译

AOT编译是一种静态编译技术,它将源代码预先编译为机器码。AOT编译器在程序运行之前执行编译过程,生成可执行文件。AOT编译的优点是可以生成非常高效的机器码,因为它可以利用编译时所有的信息来优化代码。但是,AOT编译的缺点是它需要额外的编译时间,并且在程序运行时不能动态优化代码。

介绍下JMM

JMM(Java Memory Model)Java内存模型,是java虚拟机规范中所定义的一种内存模型。

Java内存模型(Java Memory Model)描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取变量这样的底层细节。

特点:

  • 所有的共享变量都存储于主内存(计算机的RAM)这里所说的变量指的是实例变量和类变量。不包含局部变量,因为局部变量是线程私有的,因此不存在竞争问题。
  • 每一个线程还存在自己的工作内存,线程的工作内存,保留了被线程使用的变量的工作副本。
  • 线程对变量的所有的操作(读,写)都必须在工作内存中完成,而不能直接读写主内存中的变量,不同线程之间也不能直接访问对方工作内存中的变量,线程间变量的值的传递需要通过主内存完成。

介绍下MESI的实现原理

一道SQL题,手写查询语句和创建索引

假设有一个名为orders的表,其中包含以下列:

  • order_id:订单ID,类型为INT,主键。
  • customer_id:客户ID,类型为INT。
  • order_date:订单日期,类型为DATE。
  • total_amount:订单总额,类型为DECIMAL(10, 2)。

题目要求编写一个SQL查询语句,用于找出在2023年2月1日至2023年2月28日期间,每个客户的总订单金额。

查询语句

SELECT customer_id, SUM(total_amount) AS total_spent
FROM orders
WHERE order_date BETWEEN '2023-02-01' AND '2023-02-28'
GROUP BY customer_id;

这个查询语句首先筛选出2023年2月1日至2023年2月28日期间的订单,然后按照客户ID进行分组,并计算每个客户的总订单金额。

创建索引

为了提高查询效率,特别是当查询包含日期范围时,我们可以为order_date列创建一个索引。

CREATE INDEX idx_order_date ON orders (order_date);

这个索引将提高基于order_date列的查询效率,特别是对于范围查询(如本题中的BETWEEN查询)。

创建索引的注意事项

  •  针对于数据量较大,且查询比较频繁的表建立索引。单表超过10万数据(增加用户体验)
  • 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。
  • 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。
  •  如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引(它只对字段的前缀部分建立索引。对于字符串类型的字段,如果字段的长度较长,建立完整的索引可能会占用大量的空间,而且查询效率也不一定是最优的。通过建立前缀索引,可以减少索引占用的空间,同时提高查询效率。)。
  • . 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。
  • 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。
  •  如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询。

MySQL、ES、MongoDB使用场景

MySQL

MySQL是一个关系型数据库管理系统(RDBMS),它使用结构化查询语言(SQL)来管理数据。MySQL的特点是事务支持、数据一致性和查询优化。

  • 使用场景
    • 在线事务处理(OLTP):MySQL非常适合需要处理大量日常交易的应用程序,如在线购物网站、银行系统等。
    • 数据一致性要求高:MySQL支持事务,可以确保数据的一致性和完整性。
    • 传统的SQL查询:MySQL提供了强大的SQL支持,适合需要执行复杂查询的场景。

Elasticsearch(ES)

Elasticsearch是一个基于Lucene的开源搜索引擎,可以用于全文搜索、实时分析等场景。它使用JSON作为其数据存储格式,并提供了丰富的查询语言。

  • 使用场景
    • 全文搜索:ES非常适合需要进行全文搜索的应用程序,如电商产品搜索、内容管理系统等。
    • 实时分析:ES可以处理大量实时数据,并支持复杂的数据分析和聚合。
    • 分布式系统:ES是一个分布式系统,可以扩展到非常大的规模。

MongoDB

MongoDB是一个基于文档的数据库管理系统(NoSQL),它使用JSON格式的文档来存储数据。MongoDB的特点是灵活的数据模型和强大的查询能力。

  • 使用场景
    • 灵活的数据模型:MongoDB允许存储非结构化数据,适合需要灵活数据模型的场景。
    • 水平扩展:MongoDB可以很容易地水平扩展,以处理大量的数据和请求。
    • 快速查询:MongoDB支持丰富的查询语言,可以快速执行复杂的查询。

总结

选择哪种数据库管理系统取决于具体的应用需求。如果需要事务支持、数据一致性和传统的SQL查询,MySQL是一个很好的选择。如果需要进行全文搜索和实时分析,Elasticsearch可能是更好的选择。而如果需要灵活的数据模型和水平扩展能力,MongoDB则是一个合适的选择。在实际应用中,可以根据具体需求来选择最合适的数据库管理系统。

Redis 的list、string、hash底层实现

list底层为双向链表,string为动态字符串,Hash为字典(Dict)和数组(Array)数据结构。字典用于存储键值对,而数组用于存储字段的列表。

Redis的sharding(分片)方式吗

Hash取模分片

对扩/缩容很不友好

一致性Hash算法分片

引入了一个0~43亿的整数哈希环(0~2^32),把节点的ip和端口及其它信息作为字符串的对象进行散列计算,计算节点的位置,节点将哈希环分段,每一个节点负责存储一部分哈希值对应的键值对。

CRC16哈希算法使用了哈希槽(hash slot)的方式来进行数据分片,将整个数据集划分为16384个槽,每个节点负责部分槽。客户端访问数据时,先计算出数据对应的槽,然后直接连接到该槽所在的节点进行操作

ThreadLocal实现原理

ThreadLocal从使用到实现原理与源码详解_c端 登陆 实现 threadlcoal-CSDN博客

为什么不用现成的HashMap

因为无论使用HashMap或者ConcurrentHashMap,在底层上都会造成多个线程在一个对象上进行竞争的情况,并没有真正意义上满足一个线程持有一个变量的本地副本这种设计思想,ThreadLocal在实现上,是让每个线程在自己的内部单独持有一个变量,这样的话,线程之间就不会有竞争出现了。

如何排查Full GC

  1. 开启GC日志:确保JVM启动参数中包含了-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:<path-to-gc-log>,以便记录详细的GC日志。
  2. 分析日志:使用工具如gcviewer, GCHisto, VisualVM, 或 Java Mission Control来分析日志。关注点包括:
  • GC发生的频率
  • 每次GC的时间
  • GC暂停时间(尤其是Full GC)
  • 各个分代的内存使用情况
  • GC原因(如System.gc()调用)
  • 通过分析gc日志可以快速定位gc触发的原因。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程小猹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值