面试笔记 8.5

news2024/12/24 9:28:55

面试常见:

Jvm,高并发,多线程,数据库,redis,框架

1.N I/O有什么核心组件

Java NIO 基本原理以及三大核心组件_java nio核心组件有哪些-CSDN博客

Buffer 缓冲  Channel  一对一 Channel 读取数据 

Selector对应线程池  (环形链表)

2. Select  Poll Epoll区别

用户空间(用户需要的数据)和内核()

select 交换两次

poll 优化大小限制

epoll 交互的次数  0拷贝 直接用户空间和用户空间

http://t.csdnimg.cn/L6jHm

3.Http和Https的区别

HTTP 与 HTTPS 的区别 | 菜鸟教程 (runoob.com)

http超文本传输协议

https超文本传输安全协议 比如银行和金融

http是一个简单的无状态的 https是通过加密的,安全性高

http是免费的

他俩传输协议和端口号不一样

https端口号443 redis端口6379  mysql端口3306  ssh端口21

缺点:

https握手 不完全安全 涉及CA(Certificate Authority,数字证书认证机构) 申请证书

4.Jvm的结构

http://t.csdnimg.cn/tEmGW

5.Java类加载的全过程

http://t.csdnimg.cn/foByX

一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)七个阶段,其中验证、准备、解析三个部分统称为链接(Linking)。

6.(jvm)一个对象从加载到jvm开始到GC回收,经历的过程是什么

JVM基础 -> ⼀个对象从加载到JVM,再到被GC清除,都经历了什么过程?_普通对象到第一次gc经理什么-CSDN博客

 

⼀个对象从加载到JVM,再到被GC清除,都经历了什么过程?

  1. ⾸先类加载器把字节码⽂件内容加载到⽅法区,当然类加载器这中间用双亲委派机制加载

  2. 然后再根据加载完方法区中的类信息在堆区为对象分配内存丶初始化零值丶设置对象头执行 init 方法

    1. 分配内存: 确定大小的内存从 Java 堆中划分出来
    2. 初始化零值: 将分配到的内存空间都初始化为零,这样对象只定义,不初始化也可以用
    3. 设置对象头: 对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等
    4. 执行 init 方法: 最后就是调用构造方法了,初始化对象,完成创建
  3. 对象⾸先会分配在堆内存中新⽣代的Eden

    • 小对象分配在新⽣代的Eden。然后经过新生代GC,对象如果存活,就会进⼊S区。
      • 在后续的每次GC中,如果对象⼀直存活,就会在S区来回拷⻉,每移动⼀次,年龄加1。
      • 多⼤年龄才会移⼊⽼年代? 年龄最⼤15, 超过⼀定年龄后,对象转⼊⽼年代。
    • 对象够大,分配在老年代
      • JDK 6 之前存在空间担保 -> 老年代保证我会保留一个连续内存大小的内存空间
        • 如果内存不够,你就可以FullGC,还不够内存溢出
        • 如果内存够,那就存进去
      • JDK 6 之后 -> 老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小(动态年龄)
        • 如果内存不够,你就可以FullGC,还不够内存溢出
        • 如果内存够,那就存进去
  4. 当创建对象的⽅法执⾏结束后,栈中的指针会先移除掉了,对象就没有GC Roots根节点的引用了

  5. 然后GC根据可达性分析法,判断对象是否可以被回收

  6. 最后GC线程调用合适的GC算法清理掉可回收的对象

总结

1.创建对象的时候,jvm在方法区寻找对象相关信息,然后创建对象

2.在堆里面创建对象,是半初始化状态

3.对象首先会分配在堆内存中新生代Eden

4.当创建对象的⽅法执⾏结束后,栈中的指针会先移除掉了,对象就没有GC Roots根节点的引用了

5.然后GC根据可达性分析法,判断对象是否可以被回收

6.最后GC线程调用合适的GC算法清理掉可回收的对象

7.怎样确定这个对象是否被回收

​​​​​​​Java垃圾回收机制(如何判断一个对象是否该回收)_3.java垃圾收集机制,并描述垃圾收集器如何判断一个对象是否能被收集。-CSDN博客 

1.引用计数法 

计数器为0,等于垃圾,被回收

给对象增加一个计数器,当有引用它时,计数器就加一,当引用失效时,计数器就减一;

2.根可达性分析法

Java则是用了这种方法来判断是否需要回收对象;

此算法的核心思想为 : 通过一系列称为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称之为"引用链",当一个对象到GC Roots没有任何的引用链相连时(从GC Roots到这个对象不可达)时,证明此对象是不可用的;

8.Jvm有哪些垃圾回收算法   

JVM的4种垃圾回收算法、垃圾回收机制与总结_jvm垃圾回收机制有几种-CSDN博客

1.标记清除算法

2.标记复制算法(拷贝算法)

3.标记整理算法

4.分代收集算法

5.增量收集算法

6.分区算法

9.什么是STW,我们能避免它吗?

不能避免,可以进行优化

STW,即Stop-The-World的缩写,指的是系统在执行特定操作时需暂停(停止)所有应用程序线程。

JVM的4种垃圾回收算法、垃圾回收机制与总结_jvm垃圾回收机制有几种-CSDN博客

JVM对垃圾回收站进行算法处理的时候,STW是把jvm内存冻结的一种状态,在这个状态下,java所有线程都是停止状态,除了GC。 

10.如何进行jvm调优,jvm的参数有哪些

http://t.csdnimg.cn/yPY36

Jvm调优,一中是标注指令,一种是非标准指令,还有不稳定参数。

标准指令是-开头 

非标准指令 -x 

java -XX:+PrintCommandLineFlags : 查看当前命令的不稳定指令。
java -XX:+PrintFlagsInitial : 查看所有不稳定指令的默认值。
java -XX:+PrintFlagsFinal: 查看所有不稳定指令最终生效的实际值。

9.MQ是什么?有什么作用

MQ是消息队列,先进去的先出去的数据结构,消息由生产者生产,排队,由消费者进行处理。

 作用:

1.异步,作用是提高系统的响应速度和吞吐量

2.解耦,减少服与服的耦合度,减少响应时间,提高性能稳定性和可扩展性

3.削峰,稳定系统对突发流量的处理

应用场景:电商,用户要求响应时间短的类型

10.如何进行MQ产品的选型

MQ选型:ActiveMQ、RocketMQ、RabbitMQ、Kafka对比_rocketmq和rabbitmq哪个用的多-CSDN博客

MQ目前的产品RocketMQ,RabbitMQ,Kafka,ActiveMQ

Kafka

优点 吞吐量大,性能大,集群高可用

缺点 会丢失数据,功能单一

使用场景 日志分析 大数据采集等

RabbitMQ

优点 消息可靠性高,功能全面 

缺点 吞吐量低 消息积累会严重影响性能 使用的是erlang语言(不好定制)

使用场景 小规模的场景

RocketMQ 

 优点 高吞吐 高性能 高可用 功能非常全面

 缺点 开源版不如商业版功能 官方文档和周边不够成熟

使用场景 都可以用

11.如何能保证消息不丢失

1.生产者发送消息不丢失

1.消息发送给与反馈

2.手动开启事物保证消息不丢失

3.Publisher Confirm 发布确认的方式

2.同步不丢失

1.同步会丢失,异步不会丢失,采用异步的方式

2.消息存盘,保存在磁盘上面,发布一条后,再删除

4.消费者不丢失,采用默认方式消费

5.手动提交

12.如何保证消息消费的幂等性

消息中间件(三)——如何保证消息幂等性_如何保证消息的幂等性-CSDN博客

1.消息给与唯一的标识

13.如何保证消息的顺序

 RabbitMQ如何保证消息的顺序性【重点】-CSDN博客

线程取模 

14.如何保证消息队列的高效读写

上图  用到了4次拷贝  提高效率 做到0拷贝

0拷贝不经过用户态 用户空间
MappedByteBuffer
FileChannel

mmap   

使用小文件操作 不超过2G

transfile

没有文件限制 

15.MQ如何保证分布事物的最终一致性

RocketMQ事务消息如何保证数据的最终一致性_rocketmq 一致性-CSDN博客

1.生产者保证100 的头列

2.消费者保证幂等性消费,不然会造成重复消费和多次消费

16.让你去设计MQ你会怎么去设计?

1.实现一个单机队列的数据结构,是高效的,可扩展的

2.把单机队列拓展成可分布式的  集群进行处理

3.定制的一个策略,根据主题进行消息定制 (根据主题发送消息策略)I/O 实现0拷贝

4.实现一些高效的读写

17.为什么使用缓存

缓存具有高性能, 高可用的特性 ,减少对数据库的直接访问,比如连接次数

18.缓存穿透,击穿,雪崩

面试redis(缓存)--01-CSDN博客

1.缓存穿透(恶意攻击,数据库没有值)

缓存,数据库都查询不到数据

解决方法

1.缓存空值

2.设置访问名单

3.采用布隆过滤器 (空间查询效率高)

4.进行实时监控

2.缓存击穿(数据库中有值)

给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮。

解决方案:

1.设置热点缓存永不过期

2.预设热门数据

3.设置实事监控

4.互斥锁

5.逻辑穿透

雪崩

缓存大量过期,导致请求直接访问数据库,导致雪崩

 解决方法

1.添加多级缓存

2.设置更新标识缓存

3.将缓存过期时间分散

4.锁,队列的机制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1983713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ML】multi head self-attention(自注意力机制)

【ML】multi head 自注意力机制self-attention 0. Transformer1. multi head self-attention2. positional encoding3. transform 可以应用的其他领域3.1 语音识别 变体 truncated self-attention3.2 self-attention for image3.3 self-attention v.s. CNN差异3.4 self-attenti…

CSP 2022 提高级第一轮 - CSP/S 2022初试题 程序阅读第三题解析

一、代码查看 1 #include <iostream> 2 #include <algorithm> 3 4 using namespace std; 5 6 const int MAXL 1000; 7 8 int n, k, ans[MAXL]; 9 10 int main(void) 11 { 12 cin >> n >> k; 13 if (!n) cout << 0 <&l…

IO流学习总结

IO流体系 字节流 字节流&#xff1a; 字节输出流:FileOutputStream 程序---写--->文件 字节输入流:FileInputStream 程序<---读---文件 字节输出流(FileOutputStream) Testpublic void testIO01() throws IOException {/*new FileOutputStream文件不存在创建文件父…

最新CSS3纵向菜单的实现

纵向菜单 通过下面例子&#xff0c;你会知道把列表转换成菜单的关键技术 a中的#是URL的占位符可以点击&#xff0c;真正用途中写实际URL <nav class"list1"><ul><li><a href"#">Alternative</a></li><li><…

AI智能化赋能电商经济,守护消费净土,基于轻量级YOLOv8n开发构建公共生活景下的超大规模500余种商品商标logo智能化检测识别分析系统

在数字经济浪潮的推动下&#xff0c;全力发展新质生产力已成为当今社会发展的主旋律。各行各业正经历着前所未有的变革&#xff0c;其中&#xff0c;电商行业作为互联网经济的重要组成部分&#xff0c;更是以惊人的速度重塑着商业格局与消费模式。AI智能化技术的深度融合&#…

C与Python Socket性能比较

在比较 C 和 Python 的 Socket 性能时&#xff0c;主要考虑以下几个方面&#xff1a; 运行时性能&#xff1a; C 是编译型语言&#xff0c;生成的机器代码运行速度更快&#xff0c;通常能够提供更低的延迟和更高的吞吐量。Python 是解释型语言&#xff0c;运行时有一定的开销&…

分布式时序数据库TimeLyre 9.2发布:原生多模态、高性能计算、极速时序回放分析

在当今数据驱动的世界中&#xff0c;多模态数据已经成为企业的重要资产。随着数据规模和多样性的不断增加&#xff0c;企业不仅需要高效存储和处理这些数据&#xff0c;更需要从中提取有价值的洞察。工业领域在处理海量设备时序数据的同时&#xff0c;还需要联动分析警报信息、…

K8S资源之NameSpace

作用 隔离资源(默认不隔离网络) 查看所有的NS kubectl get ns创建NS kubectl create ns hello删除NS kubectl delete ns hello

GitHub无法识别Markdown的目录

可以直接下载编译好的二进制文件。 二进制文件 下载下来之后&#xff0c;发现没有后缀名无法识别&#xff0c;实际上这是个exe文件&#xff0c;所以只需要暴力地在后面加上.exe就可以开始愉快使用了。 首先将README.md文档复制到gh-md-toc.exe的根目录下。 接着按住shift键…

Java面试题——第三篇(JVM)

1. 什么情况下会发生栈内存溢出 栈是线程私有的&#xff0c;他的生命周期和线程相同&#xff0c;每个方法在执行的时候都会创建一个栈帧&#xff0c;用来存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程&#xff0c;就对应着一个栈帧…

室内浮毛空气净化器除臭吗?好用的室内浮毛空气净化器推荐

家里养了5只猫&#xff0c;满天飞的猫毛发&#xff0c;随风飘到各个角落&#xff0c;可以说苦不堪言。养了毛孩子之后&#xff0c;家里异味&#xff0c;鼻炎过敏&#xff0c;宠物掉毛真的是太闹心了&#xff01;水杯里&#xff0c;床上都是小猫咪跑酷睡觉留下的毛毛&#xff0c…

公网域名流量禁用详解

公网域名流量禁用是一个涉及网络安全和流量管理的复杂操作&#xff0c;它通常需要根据具体的网络环境和业务需求来实施。以下是一些可能的步骤和考虑因素&#xff1a; 一、明确禁用目标 首先&#xff0c;需要明确禁用公网域名流量的具体目标。这可能包括&#xff1a; 阻止未…

Vue Flow: 高效构建可视化工作流的利器

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

DeEcoStudio快捷键设置

例如 打 bgc 快捷键 直接出 .backgroundColor( ) 第一步&#xff1a;点击文件——>设置 第二步&#xff1a;找到编辑器——>实时模板 第三步&#xff1a;点击加号——>点击实时模板 第四步&#xff1a;设置快捷键 第五步&#xff1a;点击变更——>点击全选…

jangow靶机教程

项⽬地址 https://www.vulnhub.com/entry/jangow-101754/ 用vmware需要修改部分配置&#xff0c;才能通过C段扫描成功 1.在系统启动时(⻓按shift键)直到显示以下界⾯ 选择第⼆个&#xff0c;按回⻋ 继续选择第⼆个 2.按e进⼊编辑&#xff0c;进⼊以下界⾯ 删除"recove…

Linux学习笔记:Linux基础知识汇总(个人复习版)

常用命令&#xff1a; 1、ls -a&#xff1a;显示所有文件&#xff08;包括隐藏文件&#xff09;&#xff0c;简洁版 -l&#xff1a;显示所有文件&#xff0c;详细版 -R&#xff1a;显示所有文件以及子目录下文件&#xff0c;简洁版 可以搭配使用。 2、netstat -i&#x…

gitlab-runner /var/run/docker.sock connect permission denied

usermod -aG docker gitlab-runner sudo service docker restart参考&#xff1a;https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3492

LeetCode接雨水

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,…

深入SpringBoot:SpringCache的集成与使用

目录 一、SpringCache集成声明式与编程式1. 引入依赖2. SpringCache配置3. key的设置4. 使用 二、SpringCache使用1. 基于声明式注释的缓存1.1 Cacheable注解1.2 Cacheable注解属性1.2.1 CacheManager和CacheResolver1.2.2 cacheName1.2.3 key和KeyGenerator1.2.4 同步缓存 2. …

Linux 内核源码分析---处理 VFS 对象及标准函数

处理VFS对象 注册文件系统&#xff1a;在文件系统注册到内核时&#xff0c;文件系统是编译为模块&#xff0c;或者持久编译到内核中。 fs/super.c 中的register_filesystem用来向内核注册文件系统。我们可以通过/proc/filesystems查看系统所有的文件系统类型。 一个文件系统不…