JAVA面试解析

互联网大厂Java面试实录:从基础八股到项目实战的深度解析 面试官:你在项目中如何优化接口响应时间?光头强:加缓存?异步化?面试官:还可以用CDN和数据库分库分表。面试官:如何设计一个秒杀系统?光头强:限流和库存预热?面试官:还需要分布式锁和异步下单。面试官:如何保证分布式系统的一致性?光头强:用分布式事务?面试官:还有最终一致性和TCC模式。面试官:你在项目中遇到的最难的技术问题是什么?光头强:呃...内存泄漏?面试官:具体是如何解决的?面试官:今天的面试就到这里,回去等通知吧。光头强。 阅读详情

引言

说在前面的话:

本文适合人群:急等着换工作的人

我承认刷面试题很有用的,纵观几年来的JAVA面试题,你会发现每家都差不多。比如,你仔细观察,你会发现,HashMap的出现几率未免也太高了吧!连考察的知识点都一样,什么hash碰撞啊,并发问题啊!再比如JVM,无外乎考内存结构,GC算法等!因此,如果是为了面试,完全是有套路可以准备的!记住,基础再好,也架不住面试官天马行空的问,所以刷面试题还是很有必要的!

本文不适合人群:专攻JAVA某方面技术的人

因为这类人专攻JAVA某块技术,知识容易出现死角。贸然阅读本文,发现自己一堆题目都不会,会觉得有一种挫败感,发现自己连校招生都不如。然而,会点面试题不算什么,毕竟Homebrew作者也出现过解不出面试题,被Google拒绝,缘由就是,因为他不会翻转二叉树。难道你能说Homebrew的作者水平有问题!

正文

1、HashMap,源码级别的问了,包括为什么线程不安全

评注:这问题一面的时候问过了,嗯,说明大家以后面试,不管是几面,复习过的知识点还是要复习,毕竟一面的面试官只会告诉二面的面试官印象,不会具体聊问了啥问题!比如,我和二面面试官说,这个候选人基础还不错,那二面面试官就会觉得:"咦,这个人基础不错,我试试是不是真的是这样!"所以难免会出现一样的题目!

另外,此题不好答。因为是关于源码级别的问,需要复习的知识点很多。大家关注一下我,我会出一篇对HashMap能问的知识点总结。比如jdk1.7和jdk1.8的hashmap结构区别、hashmap并发问题,哈希冲突的常见解决手段等!

回答: 略去。

2、死锁

评注:这问题一面的时候问过了,嗯,凸显!

回答: 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。

产生死锁的原因主要是:

因为系统资源不足。

进程运行推进的顺序不合适。

资源分配不当等。

3、Synchronized 和 ReentrantLock 锁机制,怎么判断重入锁的,会不会是死锁?

评注:并发基础问题,懂并发编程的,应该都会。

回答:

先答区别:

API方面:synchronized既可以修饰方法,也可以修饰代码块。ReentrantLock只能在方法体中使用。

公平锁:synchronized的锁是非公平锁,ReentrantLock默认情况下也是非公平锁,但可以通过带布尔值的构造函数要求使用公平锁。

等待可中断:假如业务代码中有两个线程,Thread1 Thread2。假设 Thread1 获取了对象object的锁,Thread2将等待Thread1释放object的锁。

使用synchronized。如果Thread1不释放,Thread2将一直等待,不能被中断。synchronized也可以说是Java提供的原子性内置锁机制。内部锁扮演了互斥锁(mutual exclusion lock ,mutex)的角色,一个线程引用锁的时候,别的线程阻塞等待。

使用ReentrantLock。如果Thread1不释放,Thread2等待了很长时间以后,可以中断等待,转而去做别的事情。

至于判断重入锁,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。

4、进程和线程的区别?

评注:操作系统的题目,很常规!

回答:

进程:是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位。

线程:单个进程中执行中每个任务就是一个线程。线程是进程中执行运算的最小单位。

一个线程只能属于一个进程,但是一个进程可以拥有多个线程。多线程处理就是允许一个进程中在同一时刻执行多个任务。

线程是一种轻量级的进程,与进程相比,线程给操作系统带来侧创建、维护、和管理的负担要轻,意味着线程的代价或开销比较小。

5、进程之间如何保证同步?

评注:操作系统老题了,四种方法!

回答:上网给大家找了一张图!

JAVA面试解析(有赞二面)

6、分布式锁

评注:此题问的没头没尾的,分布式锁可以问的点很多,比如实现方式啊?性能差距啊?

回答:这题如果要详答,看我的另一篇文章《分布式之抉择分布式锁》

分布式锁有三种实现方式:数据库、缓存、Zookeeper,这里我直接罗列一下各种锁的对比吧

从理解的难易程度角度(从低到高)

数据库 > 缓存 > Zookeeper

从实现的复杂性角度(从低到高)

Zookeeper >= 缓存 > 数据库

从性能角度(从高到低)

缓存 > Zookeeper >= 数据库

从可靠性角度(从高到低)

Zookeeper > 缓存 > 数据库

7、对象 GC

评注:一面问过,把一面的回答贴过来!

回答:

这个算法的基本思路是通过一些列称为“GC Roots”的对象作为起始点,从这些点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明对象需要被回收.

如图:

JAVA面试解析(有赞二面)

上图中o3,o4对象没有任何GC Roots可达到,所有这两个对象不可用了,需要被GC回收

Java可作为GC Roots的对象包括下面几种:

虚拟机栈中引用的对象

方法区中类静态属性引用的对象

方法区中产量引用的对象

本地方法栈中JNI引用的对象

8、垃圾回收算法

评注:一面问过,把一面的回答贴过来!

回答:

标记-清除算法、标记整理算法、复制算法、分代收集算法

9、JVM 参数

评注:这个回答还是略去吧,这个问题范围太大,我不知道该怎么答。

回答:略去。

10、OOM 出现的有哪些场景?为什么会发生?

评注:常规题,只是情况太多了!

回答:

OOM for Heap (
java.lang.OutOfMemoryError: Java heap space)
:heap的最大值不满足需要,将设置heap的最大值调高即可。

OOM for StackOverflowError (Exception in thread "main"
java.lang.StackOverflowError)
:如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。

OOM for GC (
java.lang.OutOfMemoryError: GC overhead limit exceeded)
:此OOM是由于JVM在GC时,对象过多,导致内存溢出。

OOM for native thread created (
java.lang.OutOfMemoryError: unable to create new native thread)
:这个异常问题本质原因是我们创建了太多的线程,而能创建的线程数是有限制的,导致了异常的发生。

OOM for allocate huge array (Exception in thread "main":
java.lang.OutOfMemoryError: Requested array size exceeds VM limit)
:此类信息表明应用程序试图分配一个大于堆大小的数组。例如,如果应用程序new一个数组对象,大小为512M,但是最大堆大小为256M,因此OutOfMemoryError会抛出,因为数组的大小超过虚拟机的限制。

OOM for small swap (Exception in thread "main":
java.lang.OutOfMemoryError: request bytes for . Out of swap space? )
:抛出这类错误,是由于从native堆中分配内存失败,并且堆内存可能接近耗尽。

OOM for exhausted native memory (java.lang.OutOfMemoryErr
java.io.FileInputStream.readBytes(Native Method))
:由于Native memory被耗尽导致的。

11、JVM 内存结构说下吧

评注:常规题,学过JVM的都会!

回答:来一张图就好了。

有5大内存区域,按照是否被线程所共享可分为两部分,一部分是线程独占区域,包括Java栈,本地方法栈和程序计数器。还有一部分是被线程所共享的,包括方法区和堆。注意了,下一题就是问的是堆和栈的共享问题!

如下图所示

JAVA面试解析(有赞二面)

12、堆和栈的共享问题?

评注:常规题,大家应该都答的上来,属应届生常见问题!

回答:

栈内存的一个特点是数据共享,比如你线程中执行下面两句话

inti =1;

intj =1;

如下图所示

JAVA面试解析(有赞二面)

前面定义了i=1,i和1都在栈内存内,如果再定义一个j=1,此时将j放入栈内存,然后查找栈内存中是否有1,如果有则j指向1。

堆内存没有数据共享的特点,比如你线程中执行了下面两句话

Strings =newString("Hello World");

Stringw =newString("Hello World");

此时如下图所示

JAVA面试解析(有赞二面)

13、有比较过 Http 和 RPC 吗?

评注:此题我按我的理解来答。我不确定对不对,因此我觉得http和rpc没啥可比性,不是一个级别的概念。

回答:

只要是远程调用都可以叫RPC,和是不是通过http没什么关系。

那么,调用过程,也就是通信过程之间需要协议,可以是HTTP协议、dubbo协议等、其他协议等。

14、HttpClient 你说说里面的具体实现吧?(涉及了哪些东西)

评注:此题只能回答一个大概,我找了一个架构图来进行说明

回答:

如下图所示

JAVA面试解析(有赞二面)

Httpclient将对接的服务器或者集群(相同域名)称为route,并为每个route建立若干连接,并池化在连接池里。Client通过tcp/ip协议发送请求以及接受应答,在发送请求前和接收应答后都会经由interceptor进行链式处理,在httpclient里这些interceptor被称为HttpProcessor,负责处理诸如设置报文头,报文体,编码格式等以及解析报文头,报文体,解码格式等http规范报文格式范畴内的事情。

15、那要你设计一个高性能的 Http ,你会怎么设计?

评注:此题,作者漏了最重要的主语。。。Http什么?Http服务器么?HTTP接口?此题范围太大,都可以单独写文章了。可以关注作者,后面写。

回答:略去

点击此处【传送门】即可获取

【面试资料】 Java中高级核心面试知识解析 java中高级核心知识点整理 阅读详情

相关推荐

校招 java 面试基础题目及解析

Java校招面试基础核心要点解析 本文针对Java校招面试常见基础知识进行系统梳理,涵盖五大核心内容:Java基础特性(平台无关性、面向对象三大特性)、数据类型(基本与引用类型)、关键关键字(static与final的用法)、方法相关概念(重载与覆盖的区别),以及流程控制语句。通过清晰的概念阐述和典型代码示例,帮助读者深入理解Java基础知识点。其中重点讲解了多态的实现原理、static与final关键字的实际应用场景,并对比了方法重载和覆盖的技术差异,为Java面试准备提供扎实的理论基础和实用指导。

sss191s的博客 935

JAVA面试解析(有赞二面)

作者:孤独烟来自:打杂的ZRJ本文的题目出自博客http://www.54tianzhisheng.cn/2018/07/12/youzan/但是作者没有给出答案,博主斗...

架构师小秘圈 1247

Java 面试全解析:核心知识点与典型面试题

又逢“金九银十”,年轻的毕业生们满怀希望与忐忑,去寻找、竞争一个工作机会。已经在职的开发同学,也想通过社会招聘或者内推的时机争取到更好的待遇、更大的平台。然而,面试人群众多,技术市场却相对冷淡,面试的同学们不得不面临着 1 个职位 N 个应聘者的巨大竞争。问:在这种现状下,如何才能收获又多又好的 Offer?答:短期准备——刷面试题;长期筹谋——巩固核心技能。面试题怎么刷?刷高频题、有深度的题、符合时效性的题。核心技能如何巩固?先深入理解原理,再系统应用到实践。不过,面试成功并不是终极目标。我们要的,是在接

m0_54883970的博客 1932

Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

java内存溢出

沉香屑_的博客 4783

Java面试必备知识点全面解析

本文还有配套的精品资源,点击获取 简介:本系列文章针对常见的Java面试问题,深入解析Java的核心知识点,覆盖从基础到高级的各个方面。内容包括Java语言基础、类与对象、异常处理、集合框架、内存管理、多线程、IO流、网络编程、反射、设计模式和JVM的深入理解。掌握这些知识点将显著提高求职者在Java面试中的表现,有助于他们脱颖而出。 1. Java语言基础 ...

weixin_35649491的博客 1101

WAS 内存溢出分析

Websphere Application Server WAS 内存溢出分析,帮助分析内存问题

java文件第100bytes处_java.io.FileInputStream.readBytes(Native Method)的无限100%CPU使用率

我正在调试一个程序,每个外部进程有两个线程,这两个线程使用while((i = in.read(buf,0,…))继续读取Process.getErrorStream()和Process.getInputStream() buf.length))> = 0)循环。有时当外部进程由于JVM崩溃而崩溃(参见these hs_err_pid.log files)时,读取该外部进程的stdout /...

weixin_39807541的博客 877

vue高德地图POI关键字搜索定位

最近在项目中遇到了关于地图的问题,首先为了满足需求从而使用的是JSAPI为2.0版本的。需求是根据关键字搜索定位到该位置。值得注意的是在使用 AMap.Event.addListener时 Event一定要大写的E,不然页面会报错。在地图上定义一个输入框,根据输入的位置进行提示,然后点击后跳转到对应的位置并打点标记。JSAPI主要使用这两个。

YL 2136

java 系统资源不足_我在一个页面下载文件时出现了这个提示:java.io.IOException: 系统资源不足,无法完成请求的服务。...

java.io.FileInputStream.readBytes(NativeMethod)java.io.FileInputStream.read(FileInputStream.java:194)java.io.BufferedInputStream.read1(BufferedInputStream.java:254)java.i...java.io.FileInputStream.rea...

weixin_35867608的博客 770

系统安装、qt配置、安装pcie驱动

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 安装Linux系统指定:ununtu20.04并配置相关软件环境 前言 提示:这里可以添加本文要记录的大概内容: ununtu20.04、Qt 5.9.0、pcie驱动 提示:以下是本篇文章正文内容,下面案例可供参考 一、安装系统 制作系统盘(win10),在开机时按相应键进入BIOS,(华硕需要先改配置启动->CSM->开启->第一个选项选第一个或第二个),等待即可 进入后按照https://www.sysgeek.

weixin_44832804的博客 2205

Flexible H-Tree(灵活 H 树)与 Multi-Tap 时钟流程解析

通过灵活 H 树与多抽头技术的结合,复杂时钟架构可在保持电气对称性的同时适应不规则布局,为高性能、低功耗 SoC 设计提供高效的时钟网络解决方案。

weixin_45371279的博客 1914

java.io.FileInputStream.read()的返回值类型为什么是int而不是byte

通过阅读InputStream类和FileInputStream类里的read()方法(native方法)的源码,read()方法的返回值有两种含义,虽然他们都是int类型。下面我们来看一下源码:/** * Reads the next byte of data from the input stream. The value byte is * returned as an <

dajiangqingzhou的专栏 1万+

【R】非参数秩和检验(Kruskal-Wallis H)与事后多重比较邓肯检验(Dunn‘s Test)及自动字母标记

非参数检验-Kruskal-Wallis H检验-多个独立样本秩和检验-事后两两比较-邓肯检验(Duncan's test)

captain_keating的博客 6534

java面试题全解析

java面试全解析

拉着空气去兜风的博客 351

Mind+掌控板实战:5分钟搞定Easy IoT的MQTT通讯(附完整代码)

本文详细介绍了如何利用掌控板和Mind+图形化编程软件,快速实现基于Easy IoT平台的MQTT通讯。通过清晰的步骤讲解和完整的代码示例,指导用户完成从云端配置、Wi-Fi连接到MQTT消息发布与订阅的全过程,帮助初学者轻松构建物联网设备间的双向对话系统。

weixin_29300241的博客 446

华三模拟器实战:3分钟搞定路由器DHCP地址池配置(附常见错误排查)

本文提供华三模拟器中路由器DHCP地址池的实战配置指南。通过分步详解,帮助用户在3分钟内完成基础设置,并深入讲解多地址池、中继配置等进阶应用。文章重点剖析了DHCP服务无法工作的常见原因,提供从客户端到服务器的系统性排错方法,助力快速定位并解决地址分配失败、获取参数错误等典型问题。

w1x2y3的博客 360

Java面试:Spring全家桶与Spring源码深度解析

本次面试围绕Spring全家桶和Spring源码解析展开,候选人的回答展现了扎实的理论基础和丰富的实战经验。面试官对候选人的表现给予了高度评价,认为其是团队中不可多得的技术人才。

南客先生的博客 736

ESP32开发进阶:1.接入文心一言

ESP32开发进阶:接入文心一言大模型,串口对话

qq_53529450的博客 1431

Java面试-Lambda 表达式入门与面试题解析

在 Java 8 之前,我们想把“一段代码”当作参数传递,只能靠匿名内部类// 用匿名内部类创建线程@Override");}).start();// 用匿名内部类排序@Override});💢 问题:代码冗长、臃肿、重点不突出!我们只想传递run()或compare()的逻辑,却要写一堆模板代码。Lambda 表达式的出现,就是为了解决这个问题。函数(一段可执行的代码)可以像对象一样被创建、传递和使用。有且仅有一个抽象方法的接口。可以有多个default方法或static方法。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java 软件工程师面试:技能要求、面试准备及常见问题解析

ava 软件工程师是软件开发中的关键角色之一,需要掌握扎实的Java 编程基础和丰富的项目经验。在面试中,除了技术能力外,面试官通常还会关注面试者的沟通能力、团队协作精神和问题解决能力等综合素质。本指南将介绍Java 软件工程师面试的技能要求、面试准备和常见问题解析,希望能帮助面试者在面试中取得成功。

nbsaas-boot基于Request-Response的企业级快速开发框架 1656

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java面试:SpringBoot与SpringCloud源码深度解析

本次面试通过层层深入的提问,全面考察了候选人对SpringBoot和SpringCloud源码的理解和实战能力。候选人的回答不仅展现了扎实的理论基础,还体现了丰富的项目经验。面试官对候选人的表现给予了高度评价,认为其是团队中不可多得的技术人才。

南客先生的博客 869

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java 面试题及详细解析

异常是程序在运行过程中发生的非正常情况。Java 提供了异常处理机制来处理这些情况,确保程序不会因为异常而崩溃。异常分为两类:受检查异常(Checked Exception)和未受检查异常(Unchecked Exception)。垃圾回收是自动管理内存的过程,它通过识别和回收不再使用的对象来释放内存空间。Java 使用垃圾回收机制来避免内存泄漏和优化内存使用。泛型是 Java 语言中的一种机制,它允许在类、接口和方法中使用类型参数。

power_9的博客 1387

Java 面试八股文汇总(1000 道附答案解析)

一线互联网公司都比较注重实际的项目中解决问题的能力,另外面试点主要围绕 JVM、多线程相关、基础知识的底层原理、处理高并发的能力。这里也不扯什么面试技巧了,轻松发挥就好,祝大家金九银十季能有个高薪满意的工作!你的支持,我的动力;祝各位前程似锦,offer 不断!!!Ps:由于篇幅限制,笔记无法全部为大家展示出来,就以截图主要内容的形式让大家参考啦,需要完整的朋友可以【领取/点击】

jj1245_的博客 1898

Java面试趣解析

好的,马小帅,今天的面试就到这里了。我们会尽快通知你后续结果。

zhaomh2017的博客 855
上一篇: 阿里p8架构师谈:彻底弄懂 Java 线程池原理
下一篇: Java程序员一定要做的 6 件事!+福利!
java小望
博客等级 码龄5年 1粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值