一、概括

涉及JVM的GC、三色标记

并发部分的锁

Java集合中的hashmap、list

kafka中ISR相关

硬件相关-有无DMA

自定义类(代码)

缺陷:锁、list

二、JVM相关内容

1、如何判断什么是垃圾

(1)方法1:有无引用指向-reference count

无法解决循环引用

(2)可达性分析/根可达算法

从根main函数上能找到的对象

2、介绍一下常见的垃圾回收算法

(1)标记-清除算法(Mark-Sweep):碎片化现象

(2)拷贝复制算法(Copying):有用的拷贝到另一半(空闲面),但浪费空间

(3)标记-整理算法(Mark-compact):清除垃圾后,把有用的往前放

(4)分代收集算法:

堆:新生代(Tenured Generation)+老年代

非堆:永久代(Permanet)

新生代回收大量对象,老年代回收少量对象

3、不同的垃圾回收器

Serial Old/Serial

Parallel Old/ParNew/Parallel Scavenge

CMS(Concurrent Mark Sweep)

G1

ZGC

4、描述一下三色标记算法

在Concurrent Mark Sweep,CMS-并发垃圾回收器中

并发(GC+业务线程分别进行)操作存在在的问题:浮动垃圾

如何找到没有引用的对象-三色标记算法

黑、白、灰

存在问题:

(1)业务线程标记已回收对象指向被引用节点(白色),采取Incremental Update

(2)上述并发方式,容易产生漏标,remark再标一遍

三、Java并发-常见的锁

常见的锁分类大致有:排它锁、共享锁、乐观锁、悲观锁、分段锁、自旋锁、公平锁、非公平锁、可重入锁等。

1.公平锁 / 非公平锁:是否按顺序申请锁

2.可重入锁 / 不可重入锁:是否可重复或递归调用,ReentrantLock和synchronized/两次调用lock()不释放导致死锁

3.排他锁 / 共享锁:C.U.T包下的ReeReentrantLock/ReentrantReadWriteLock

4.互斥锁 / 读写锁:访问共享资源前加锁/读时加锁、写时加锁、不加锁(既是共享锁,也是排他锁)

5.乐观锁 / 悲观锁:java.util.concurrent.atomic包下面的原子变量类使用CAS/synchronized和ReentrantLock等独占锁只给一个进程使用

6.分段锁:是一种锁的设计,ConcurrentHashMap就是基于分段锁实现高效并发

7.偏向锁 / 轻量级锁 / 重量级锁:一段同步代码一直被一个线程所访问/锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁/锁为轻量级锁时,另一个线程自旋一定次数时还没有获取到锁,就会进入阻塞

8.自旋锁:CAS是英文单词Compare and Swap(比较并交换),当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环

四、java集合

1、HashMap

JDK1.7:Entry数组 + 链表

JDK1.8:Node 数组 + 链表/红黑树,转红黑树提高查询效率到O(logN)

2、HashMap是否线程安全,如何保证线程安全

使用 ConcurrentHashMap保证线程安全

或者使用

Collections.synchronizedMap(hashMap),使其实现同步

3、ConcurrentHashMap如何保证线程安全

采用锁分段技术,将整个Hash桶进行了分段segment,也就是将这个大的数组分成了几个小的片段 segment,而且每个小的片段 segment 上面都有锁存在,那么在插入元素的时候就需要先找到应该插入到哪一个片段 segment,然后再在这个片段上面进行插入,而且这里还需要获取 segment 锁

4、HashMap 与 HashTable 的区别

HashTable 基于 Dictionary 类,而 HashMap 是基于 AbstractMap

HashMap 的 key 和 value 都允许为 null,而 Hashtable 的 key 和 value 都不允许为 null

Hashtable 是线程安全的,而 HashMap 不是线程安全的

5、List的subList返回的对象和原始的引用相关吗

不会返回新的list对象

返回原来list的从[fromIndex, toIndex)之间这一部分的视图,实际上,返回的list是靠原来的list支持的。

对原来的list和返回的list做的“非结构性修改”(non-structural changes),都会影响到彼此对方。

如何删除一个list的某个区段:list.subList(from, to).clear();--将元素释放并清空内部属性

6、String的subString

返回一个新的字符串,是原始字符串的子字符串

字符串会存放在堆内存

返回一个新的字符串对象

五、kafka的ISR队列和OSR队列

1、含义

ISR(In-Sync Replicas),副本同步队列。ISR中包括Leader和Follower。如果Leader进程挂掉,会在ISR队列中选择一个服务作为新的Leader。有replica.lag.max.messages(延迟条数)和replica.lag.time.max.ms(延迟时间)两个参数决定一台服务是否可以加入ISR副本队列,在0.10版本移除了replica.lag.max.messages参数,防止服务频繁的进去队列。
任意一个维度超过阈值都会把Follower剔除出ISR,存入OSR(Outof-Sync Replicas)列表,新加入的Follower也会先存放在OSR中。

2、深层次理解

(1)消息组成

LEO:从哪落盘,即表示下一条待写入数据的index【下一条待写入位置】
HW:表示数据从哪消费,HW之前的数据对消费者可见,能够被消费者消费
firstUnstableOffset:第一条未提交数据
lastStableOffset:最后一条已提交数据
LogStartOffset:起始位置
(2)如何通过更新LEO,进行副本同步
leader和follower都有HW,LEO会选择ISR中HW和自身LEO最小的进行写入,LEO落盘后,进行+1
当leader挂掉,变为follower后,follower的HW会覆盖当前节点的HW,会导致数据丢失

六、DMA--延伸到零拷贝机制

“Direct Memory Access(存储器直接访问)。这是指一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据。整个数据传输操作在一个称为"DMA控制器"的控制下进行的。CPU除了在数据传输开始和结束时做一点处理外(开始和结束时候要做中断处理),在传输过程中CPU可以进行其他的工作(前提是未设置停止CPU访问)。这样,在大部分时间里,CPU和输入输出都处于并行操作。因此,使整个计算机系统的效率大大提高”。

DMA方式中,主存与I/0设备之间有一条数据通路(专用数据总线),则交换信息时无需像中断一样调用中断服务程序,数据不经过CPU,直接通过这条线传输,所以DMA是需要硬件支持的。【使用硬件传输数据】

1、含义

DMA是一种内存访问技术;
可以独立于CPU, 直接读、写系统存储器、外设等

2、使用原因

把比较固定的任务让DMA来做,可以减轻CPU负担,提高系统的效率

DMA具有一般CPU没有的高效操作,提高系统的吞吐率

3、kafka的零拷贝机制

传统的传输方式

零拷贝机制--没有去内存中拷贝数据

无需经过CPU拷贝数据到内存中

从硬盘直接读到操作系统内核的读缓冲区里面

根据 Socket 的描述符信息,直接从读缓冲区里面,写入到网卡的缓冲区里面

具体实现:-使用NIO机制,实现了直接内存缓冲区的开辟

应用程序通过调用mmap(),将不同的虚拟地址映射到了同一物理地址,即内核缓冲区,使程序在用户态可以直接读取并操作内核空间的数据

使用DMA的方式将磁盘数据读取到内核缓冲区,然后通过内存映射的方式,使用户缓冲区和内核读缓冲区的内存地址为同一内存地址

七、自定义类-list实现栈

import java.util.LinkedList;

/**
* Created by lili on 15/11/14.
*/
public class MyStack {
private LinkedList linkedList; public MyStack() {
linkedList = new LinkedList();
} public void push(Object o) {
linkedList.addFirst(o);
} public Object pop() {
//删除并返回
return linkedList.removeFirst();
} public boolean isEmpty() {
return linkedList.isEmpty();
}
}

【笔面试真题】Flow++赋乐科技-面试-2022年1月25日的更多相关文章

  1. 秋招如何抱佛脚?2022最新大厂Java面试真题合集(附答案

    2022秋招眼看着就要来了,但是离谱的是,很多同学最近才想起来还有秋招这回事,所以纷纷临时抱佛脚,问我有没有什么快速磨枪的方法, 我的回答是:有! 说起来,临阵磨枪没有比背八股文更靠谱的了,很多人对这 ...

  2. 面试系列二:精选大数据面试真题JVM专项-附答案详细解析

    公众号(五分钟学大数据)已推出大数据面试系列文章-五分钟小面试,此系列文章将会深入研究各大厂笔面试真题,并根据笔面试题扩展相关的知识点,助力大家都能够成功入职大厂! 大数据笔面试系列文章分为两种类型: ...

  3. WEB前端面试真题 - 2000!大数的阶乘如何计算?

    HTML5学堂-码匠:求某个数字的阶乘,很难吗?看上去这道题异常简单,却不曾想里面暗藏杀机,让不少前端面试的英雄好汉折戟沉沙. 面试真题题目 如何求"大数"的阶乘(如1000的阶乘 ...

  4. 分享13道上海尚学堂拿回来的Java面试真题,这些都是Java核心常见问题,想拿OFFER必看!

    上海尚学堂Java培训学员参加面试带回来的真题,分享出来与大家,希望大家能认真地看看做一遍.后面有详细题解答案,对照下,看看自己做得怎么样,把这些面试遇到的真题全部掌握,做好面试笔试前的准备. 一.1 ...

  5. Python面试真题答案或案例

    Python面试真题答案或案例如下: 请等待. #coding=utf-8 #1.一行代码实现1--100之和 print(sum(range(1,101))) #2.如何在一个函数内部修改全局变量 ...

  6. 2018最新大厂Android面试真题

    前言 又到了金三银四的面试季,自己也不得不参与到这场战役中来,其实是从去年底就开始看,android的好机会确实不太多,但也还好,3年+的android开发经历还是有一些面试机会的,不过确实不像几年前 ...

  7. 拼多多后台开发面试真题:如何用Redis统计独立用户访问量

    众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作3年的开发,稍微优秀一点的,都给到30K的Offer,当然,拼多多加班也是出名的,一周上6天班是常态,每天工作时间基本都是超过1 ...

  8. 拼多多面试真题:如何用 Redis 统计独立用户访问量!

    阅读本文大概需要 2.8 分钟. 作者:沙茶敏碎碎念 众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作 3 年的开发,稍微优秀一点的,都给到 30K 的 Offer. 当然,拼 ...

  9. 大厂0距离:网易 Linux 运维工程师面试真题,内含答案

    作为 Linux 运维工程师,进入大公司是开启职业新起点的关键,今天马哥 linux 运维及云计算智囊团的小伙伴特别分享了其在网易面试 Linux 运维及云计算工程师的题目和经历,希望对广大 Linu ...

  10. 再也不用担心问RecycleView了——面试真题详解

    关于RecycleView,之前我写过一篇比较基础的文章,主要说的是缓存和优化等问题.但是有读者反映问题不够实际和深入.于是,我又去淘了一些关于RecycleView的面试真题,大家一起看看吧,这次的 ...

随机推荐

  1. 使用读写分离模式扩展 Grafana Loki

    转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247500127&idx=1&sn=995987d558 ...

  2. 使用 Docker 安装 Elastic Stack 8.0 并开始使用

    文章转载自:https://mp.weixin.qq.com/s/fLnIzbbqYfILS6uCvGctXw 运行 Elasticsearch docker network create elast ...

  3. Traefik 2.0 暴露 Redis(TCP) 服务

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247484452&idx=1&sn=0a17b907 ...

  4. 使用filebeat过滤掉部分字段

    host,agent,ecs三个字段也是不让drop的 processors: - drop_fields: fields: ["log","input",&q ...

  5. 在 Linux 中找出内存消耗最大的进程

    1 使用 ps 命令在 Linux 中查找内存消耗最大的进程 ps 命令用于报告当前进程的快照.ps 命令的意思是"进程状态".这是一个标准的 Linux 应用程序,用于查找有关在 ...

  6. Go 源码解读|如何用好 errors 库的 errors.Is() 与 errors.As() 方法

    前言 快一个月没有更新技术文章了,这段时间投注了较多的时间学习字节的开源项目 Kitex/Hertz ,并维护一些简单的 issue ,有兴趣的同学也可以去了解: https://www.cloudw ...

  7. SECS半导体设备通讯-4 GEM通信标准

    一 概述 GEM标准定义了通信链路上的半导体设备的行为. SECS-II标准定义了在主机和设备之间交换的消息和相关数据项.GEM标准则定义了在哪种情况下应该使用哪些SECS-II消息以及由此产生的结果 ...

  8. PHP全栈开发(四): HTML 学习(1.基础标签+表格标签)

    简单的学习一下HTML 学习HTML采用在www.runoob.com上学习的方法. 而且该网站还提供在线编辑器. 然后HTML编辑器使用Notepad++ 记得上Emmet的官网http://emm ...

  9. Java19虚拟线程都来了,我正在写的线程代码会被淘汰掉吗?

    Java19中引入了虚拟线程,虽然默认是关闭的,但是可以以Preview模式启用,这绝对是一个重大的更新,今天Java架构杂谈带大家开箱验货,看看这家伙实现了什么了不起的功能. 1 为什么需要虚拟线程 ...

  10. Go Micro介绍与入门

    一 什么是Micro? Micro是一个微服务生态系统,致力于提供产品,服务和解决方案,以实现现代软件驱动型企业的创新.我们计划成为任何与微服务相关的事实资源,并期待公司能够利用这项技术为自己的业务. ...