常见的100道java面试题及答案【java学习+面试指南】(五)
消息队列有哪些应用场景?
异步处理、流量控制、服务解耦、消息广播
ZGC收集器中的染色指针有什么用?
染色指针是一种直接将少量额外的信息存储在指针上的技术,可是为什么指针本身也可以存储额外信息呢?在64位系统中,理论可以访问的内存高达16EB(2的64次幂)字节 [3] 。实际上,基于需求(用不到那么多内存)、性能(地址越宽在做地址转换时需要的页表级数越多)和成本(消耗更多晶体管)的考虑,在AMD64架构 [4] 中只支持到52位(4PB)的地址总线和48位(256TB)的虚拟地址空间,所以目前64位的硬件实际能够支持的最大内存只有256TB。此外,操作系统一侧也还会施加自己的约束,64位的Linux则分别支持47位(128TB)的进程虚拟地址空间和46位(64TB)的物理地址空间,64位的Windows系统甚至只支持44位(16TB)的物理地址空间。
尽管Linux下64位指针的高18位不能用来寻址,但剩余的46位指针所能支持的64TB内存在今天仍然能够充分满足大型服务器的需要。鉴于此,ZGC的染色指针技术继续盯上了这剩下的46位指针宽度,将其高4位提取出来存储四个标志信息。通过这些标志位,虚拟机可以直接从指针中看到其引用对象的三色标记状态、是否进入了重分配集(即被移动过)、是否只能通过finalize()方法才能被访问到。当然,由于这些标志位进一步压缩了原本就只有46位的地址空间,也直接导致ZGC能够管理的内存不可以超过4TB(2的42次幂) 。
为什么进程上下文切换比线程上下文切换代价高?
进程切换分两步:
切换页目录以使用新的地址空间
切换内核栈和硬件上下文
对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的
tomcat 如何优化?
1、优化连接配置.这里以tomcat7的参数配置为例,需要修改conf/server.xml文件,修改连接数,关闭客户端dns查询。 ## RocketMQ消费模式有几种? 集群消费 一条消息只会被同Group中的一个Consumer消费 多个Group同时消费一个Topic时,每个Group都会有一个Consumer消费到数据 ## unzip 命令 解压 *.zip 文件:unzip test.zip 。 查看 *.zip 文件的内容:unzip -l jasper.zip 。 ## 字长 l 机器字长:计算机能直接处理的二进制位数 ## Spring事务中的隔离级别有哪几种? 在TransactionDefinition接口中定义了五个表示隔离级别的常量: ## 说一下 JVM 调优的工具? 常用调优工具分为两类,jdk自带监控工具:jconsole和jvisualvm,第三方有:MAT(Memory AnalyzerTool)、GChisto。 ## MongoDB支持存储过程吗?如果支持的话,怎么用? MongoDB支持存储过程,它是javascript写的,保存在db.system.js表中。 ## Mycat是什么? Mycat是基于MySQL的数据库中间件,目的是为了降低数据库的压力。 ## 请解释Nginx如何处理HTTP请求。 Nginx使用反应器模式。主事件循环等待操作系统发出准备事件的信号,这样数据就可以从套接字读取,在该实例中读取到缓冲区并进行处理。单个线程可以提供数万个并发连接。 ## consumer_offsets 是做什么用的? 这是一个内部主题,公开的官网资料很少涉及到。因此,我认为,此题属于面试官炫技一类 的题目。你要小心这里的考点:该主题有 3 个重要的知识点,你一定要全部答出来,才会显得对这块知识非常熟悉。 ## 说下进程和线程的联系与区别 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位 ## Hash索引和B+树索引有什么区别或者说优劣呢? 首先要知道Hash索引和B+树索引的底层实现原理: ## 什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing)? 线程调度器是一个操作系统服务,它负责为Runnable状态的线程分配CPU时间。一旦我们创建一个线程并启动它,它的执行便依赖于线程调度器的实现。 ## 进行库表拆分时,拆分规则怎么取舍? 1.不存在热点数据时,则使用连续分片 ## Nginx的优缺点? 优点: 占内存小,可实现高并发连接,处理响应快 可实现http服务器、虚拟主机、方向代理、负载均衡 Nginx配置简单 可以不暴露正式的服务器IP地址 ## hashCode 与 equals (重要) HashSet如何检查重复 ## Spring Boot 中的监视器是什么? Spring boot actuator 是 spring 启动框架中的重要功能之一。Spring boot 监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为 HTTP URL 访问的REST 端点来检查状态。 ## 在计算机系统结构中,什么是翻译?什么是解释? 1)翻译:将一种语言编写的程序全部翻译成另一种语言,然后再执行; 2)解释:将一种语言编写的程序的一条语句翻译成另一种语言的一条或多条语句,然后执行,执行完这条语言后,再解释下一条。 ## 在MVCC并发控制中,读操作可以分成哪几类? 1. 快照读 (snapshot read):读取的是记录的可见版本 (有可能是历史版本),不用加锁(共享读锁s锁也不加,所以不会阻塞其他事务的写) 2. 当前读 (current read):读取的是记录的最新版本,并且,当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条记录 ## 介绍一下类文件结构吧! 魔数: 确定这个文件是否为一个能被虚拟机接收的 Class 文件。 Class 文件版本 :Class 文件的版本号,保证编译正常执行。 常量池 :常量池主要存放两大常量:字面量和符号引用。 访问标志 :标志用于识别一些类或者接口层次的访问信息,包括:这个 Class 是类还是接口,是否为 public 或者 abstract 类型,如果是类的话是否声明为 final 等等。 当前类索引,父类索引 :类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名,由于 Java 语言的单继承,所以父类索引只有一个,除了 java.lang.Object 之外,所有的 java 类都有父类,因此除了 java.lang.Object 外,所有 Java 类的父类索引都不为 0。 接口索引集合 :接口索引集合用来描述这个类实现了那些接口,这些被实现的接口将按implents(如果这个类本身是接口的话则是extends) 后的接口顺序从左到右排列在接口索引集合中。 字段表集合 :描述接口或类中声明的变量。字段包括类级变量以及实例变量,但不包括在方法内部声明的局部变量。 方法表集合 :类中的方法。 属性表集合 : 在 Class 文件,字段表,方法表中都可以携带自己的属性表集合。 ## 为什么要设计后缀表达式,有什么好处? 后缀表达式又叫逆波兰表达式,逆波兰记法不需要括号来标识操作符的优先级。 ## 死锁的避免与诊断? 如果一个线程最多只能获取一个锁,那么就不会发生锁顺序死锁了。如果确实需要获取多个锁,锁的顺序可以按照某种规约,比如两个资源的id值,程序按规约保证获取锁的顺序一致。或者可以使用显式的锁Lock,获取锁的时候设置超时时间,超时后可以重新发起,以避免发生死锁。 ## 你们项目中分片的实现方式是什么? 在rule.xml中配置PartitionByMod ## 有三个线程T1,T2,T3,怎么确保它们按顺序执行? 在多线程中有多种方法让线程按特定顺序执行,你可以用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行。为了确保三个线程的顺序你应该先启动最后一个(T3调用T2,T2调用T1),这样T1就会先完成而T3最后完成。 ## 再说说RocketMQ 是如何保证数据的高容错性的? 在不开启容错的情况下,轮询队列进行发送,如果失败了,重试的时候过滤失败的Broker 如果开启了容错策略,会通过RocketMQ的预测机制来预测一个Broker是否可用 如果上次失败的Broker可用那么还是会选择该Broker的队列 如果上述情况失败,则随机选择一个进行发送 在发送消息的时候会记录一下调用的时间与是否报错,根据该时间去预测broker的可用时间 ## 什么是spring? Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。 ## 什么情况下应不建或少建索引 1、表记录太少 ## 任何一台Broker突然宕机了怎么办? Broker主从架构以及多副本策略。Master收到消息后会同步给Slave,这样一条消息就不止一份了,Master宕机了还有slave中的消息可用,保证了MQ的可靠性和高可用性。而且Rocket MQ4.5.0开始就支持了Dlegder模式,基于raft的,做到了真正意义的HA。 ## AQS支持几种同步方式? 1)独占式 ## 了解过哪些负载均衡算法? 轮询(Round Robin) 轮询算法把每个请求轮流发送到每个服务器上。 该算法比较适合每个服务器的性能差不多的场景,如果有性能存在差异的情况下,那么性能较差的服务器可能无法承担多大的负载。 ## this关键字的用法 this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。 ## HashMap与HashTable的区别? HashMap没有考虑同步,是线程不安全的;Hashtable使用了synchronized关键字,是线程安全的; HashMap允许K/V都为null;后者K/V都不允许为null; ## "ObjectID"有哪些部分组成 一共有四部分组成:时间戳、客户端ID、客户进程ID、三个字节的增量计数器 ## 如何避免消息重复投递或重复消费? 在消息生产时,MQ内部针对每条生产者发送的消息生成一个inner-msg-id,作为去重和幂等的依据(消息投递失败并重传),避免重复的消息进入队列;在消息消费时,要求消息体中必须要有一个bizId(对于同一业务全局唯一,如支付ID、订单ID、帖子ID等)作为去重和幂等的依据,避免同一条消息被重复消费。 ## 什么是RabbitMQ?为什么使用RabbitMQ? RabbitMQ是一款开源的,Erlang编写的,基于AMQP协议的,消息中间件; ## Maven依赖冲突 每个显式声明的类包都会依赖于一些其它的隐式类包,这些隐式的类包会被maven间接引入进来,因而可能造成一个我们不想要的类包的载入,严重的甚至会引起类包之间的冲突。 ## 你知道哪些GC类型? Minor GC:发生在年轻代的 GC。 Major GC:发生在老年代的 GC。 Full GC:全堆垃圾回收。比如 Metaspace 区引起年轻代和老年代的回收。 ## 如何判断一个常量是废弃常量 ? 运行时常量池主要回收的是废弃的常量。假如在常量池中存在字符串 "abc",如果当前没有任何 String 对象引用该字符串常量的话,就说明常量 "abc" 就是废弃常量,如果这时发生内存回收的话而且有必要的话,"abc" 就会被系统清理出常量池。 ## Elasticsearch中的倒排索引是什么? 倒排索引是搜索引擎的核心。搜索引擎的主要目标是在查找发生搜索条件的文档时提供快速搜索。倒排索引是一种像数据结构一样的散列图,可将用户从单词导向文档或网页。它是搜索引擎的核心。其主要目标是快速搜索从数百万文件中查找数据。 ## ThreadLocal实现原理 详见:https://www.cnblogs.com/fsmly/p/11020641.html ## 什么是 java序列化? 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题 ## Zookeeper是怎么保证数据一致性的? 详见:https://blog.csdn.net/liuchang19950703/article/details/111406622 ## 对象都是优先分配在年轻代上的吗? 不是。当新生代内存不够时,老年代分配担保。而大对象则是直接在老年代分配。 ## Zookeeper有哪些节点类型? PERSISTENT-持久节点 除非手动删除,否则节点一直存在于Zookeeper上 ## tomcat 有哪几种Connector 运行模式(优化)?
bio:传统的Java I/O操作,同步且阻塞IO。
maxThreads=“150”//Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。默认值200。可以根据机器的时期性能和内存大小调整,一般可以在400-500。最大可以在800左右。
minSpareThreads=“25”—Tomcat初始化时创建的线程数。默认值4。如果当前没有空闲线程,且没有超过maxThreads,一次性创建的空闲线程数量。Tomcat初始化时创建的线程数量也由此值设置。
maxSpareThreads=“75”–一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值50。一旦创建的线程超过此数值,Tomcat会关闭不再需要的线程。线程数可以大致上用 “同时在线人数每秒用户操作次数系统平均操作时间” 来计算。
acceptCount=“100”----指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。默认值10。如果当前可用线程数为0,则将请求放入处理队列中。这个值限定了请求队列的大小,超过这个数值的请求将不予处理。
connectionTimeout=“20000” --网络连接超时,默认值20000,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
Zookeeper的典型应用场景
数据发布/订阅
负载均衡
命名服务
分布式协调/通知
集群管理
Master选举
分布式锁
分布式队列
HashMap是怎么实现的?
详见:https://blog.csdn.net/woshimaxiao1/article/details/83661464
如何实现 java 序列化?
序列化的实现,将需要被序列化的类实现Serializable 接口,该接口没有需要实现的方法,implements Serializable 只是为了标注该对象是可被序列化的,然后使用一个输出流(如:File Output Stream)来构造一个 Object Output Stream(对象流)对象,接着,使用 Object Output Stream 对象的 write Object(Object obj)方法就可以将参数为 obj 的对象写出(即保存其状态),要恢复的话则用输入流。
Tomcat的缺省端口是多少,怎么修改?
1)找到Tomcat目录下的conf文件夹 ## 了解过粘包拆包吗?为什么会出现粘包拆包?怎么处理粘包拆包? 粘包的主要原因:发送方写入数据0,即3台。 ## 微服务有哪些特点? · 解耦 – 系统内的服务很大程度上是分离的。因此,整个应用程序可以轻松构建,更改和扩展 · 组件化 – 微服务被视为可以轻松更换和升级的独立组件 · 业务能力 – 微服务非常简单,专注于单一功能 · 自治 – 开发人员和团队可以彼此独立工作,从而提高速度 · 持续交付 – 通过软件创建,测试和批准的系统自动化,允许频繁发布软件 · 责任 – 微服务不关注应用程序作为项目。相反,他们将应用程序视为他们负责的产品 · 分散治理 – 重点是使用正确的工具来做正确的工作。这意味着没有标准化模式或任何技术模式。开发人员可以自由选择最有用的工具来解决他们的问题 · 敏捷 – 微服务支持敏捷开发。任何新功能都可以快速开发并再次丢弃 ## 打印 /etc/passwd 的 1 到 3 行? 使用 sed 命令:sed -n '1,3p' /etc/passwd 使用 awk 命令:awk 'NR>=1&&NR
