最新Java面试题总结及答案【附答案解析】Java面试题及答案,Java面试题最新面试题,Java面试题新答案已经全部更新完了,有些答案是自己总结的,也有些答案是在网上搜集整理的。这些答案不免会存在一些错误,仅供大家参考。如果发现错误还望大家多多包涵,不吝见教,谢谢~
如果不背 Java面试题的答案,肯定面试会挂!
我在 CSDN 发布的其他的 Jvm ,SpringCloud,SpringBoot 面试题
SpringBoot面试题及答案140道(最新)持续更新_架构师专栏的博客-CSDN博客工作5年,处于找工作中ing。今年10月份刚刚整理出来的SpringBoot面试题,时间比力赶就没有按照模块分类排序了。总而言之,顺序比力乱,希望大家耐着性子 看。如果实在介意,评论告知,我会视情况作修改的。别的如果大家以为我找的SpringBoot面试题答案不够清楚,欢迎私信大概评论只出,我看到都会去修改的!1、SpringBoot有哪些长处?SpringBoot的长处有:1、淘汰开发,测试时间和努力。2、使用JavaConfig有助于制止使用XML。3、制止大量的Maven..._springboot面试题https://souyunku.blog.csdn.net/article/details/120850410
300道SpringCloud面试题及答案(最新整理)_架构师专栏的博客-CSDN博客最新SpringCloud面试题及答案【附答案解析】SpringCloud面试题及答案,SpringCloud最新面试题及答案,SpringCloud面试题新答案已经全部更新完了,有些答案是自己总结的,也有些答案是在网上搜集整理的。这些答案不免会存在一些错误,仅供大家参考。如果发现错误还望大家多多包涵,不吝见教,谢谢~如果不背 SpringCloud面试题的答案,肯定面试会挂!这套SpringCloud面试题大全,希望对大家有帮助哈~博主已将以下这些面试题整理成了一个Java面试手册,是PDF版_springcloud面试题https://souyunku.blog.csdn.net/article/details/121652224
110道 MySQL面试题及答案 (持续更新)_mysql 面试题_架构师专栏的博客-CSDN博客MySQL面试题及答案 【最新版】MySQL面试题大全,发现网上许多MySQL面试题及答案整理都没有答案,所以花了很长时间搜集,本套MySQL面试题大全如果不背 MySQL面试题的答案,肯定面试会挂!这套MySQL面试题大全,希望对大家有帮助哈~博主已将以下这些面试题整理成了一个面试手册,是PDF版的1、NOW()和CURRENT_DATE()有什么区别?NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒。CURRENT_DATE()仅显示当前年份,月份和日期。2、CHA_mysql 面试题https://souyunku.blog.csdn.net/article/details/121677978
Java中级面试题及答案(120道Java中级面试题大汇总)_架构师专栏的博客-CSDN博客Java中级面试题及答案【最新版及答案,干货!!!这是一个中级Java面试系列题中的第一部分。这一部分论述了可变参数,断言,垃圾回收,初始化器,令牌化,日期,日历等等Java焦点问题。Java中级面试永久是步调员迈向成功的第一个门槛,想要面试成功,各种面试题的洗礼是必不可少的,下面就来看看小编精心整理的一些java高级工程师面试题及答案吧。如果不背 Java面试题的答案,肯定面试会挂!这套Java面试题大全,希望对大家有帮助哈~博主已将以下这些面试题整理成了一个Java面试手册,是PDF版的_java中级面试题https://souyunku.blog.csdn.net/article/details/121208556
110道 Jvm面试题总结及答案 (持续更新)_架构师专栏的博客-CSDN博客最新Jvm面试题总结及答案【附答案解析】Jvm面试题及答案2021,Jvm面试题最新面试题,Jvm面试题新答案已经全部更新完了,有些答案是自己总结的,也有些答案是在网上搜集整理的。这些答案不免会存在一些错误,仅供大家参考。如果发现错误还望大家多多包涵,不吝见教,谢谢~如果不背 Jvm面试题的答案,肯定面试会挂!这套Jvm面试题大全,希望对大家有帮助哈~博主已将以下这些面试题整理成了一个面试手册,是PDF版的1、谈谈动态年龄判断1、这里涉及到 -XX:TargetSurvivorRati._jvm面试题https://souyunku.blog.csdn.net/article/details/121648703
已经整理成7000多页,面试手册PDF版已经整理成7000多页,面试手册PDF版https://mp.weixin.qq.com/s/TMBjoux5tpcqmbEFR-pDrA
1、CMS分为哪几个阶段?
CMS已经弃用。生活优美,时间有限,不发起再深入研究了。如果碰到问题,直接祭出回收过程即可。
1、 初始标记
2、 并发标记
3、 并发预清算
4、 并发可取消的预清算
5、 重新标记
6、 并发清算
由于《深入理解java虚拟机》一书的盛行,面试时省略3、4步一般也是没问题的。
2、Thread类的sleep()方法和对象的wait()方法都可以让线程停息实行,它们有什么区别?
sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程停息实行指定的时间,将实行时机(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会主动恢复(线程回到就绪状态,请参考第66题中的线程状态转换图)。wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程停息实行),进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新得到对象的锁就可以进入就绪状态。
补充:可能不少人对什么是进程,什么是线程还比力模糊,对于为什么必要多线程编程也不是特别理解。简单的说:进程是具有一定独立功能的步调关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调理的一个独立单位;线程是进程的一个实体,是CPU调理和分派的根本单位,是比进程更小的能独立运行的根本单位。线程的划分尺度小于进程,这使得多线程步调的并发性高;进程在实行时通常拥有独立的内存单位,而线程之间可以共享内存。使用多线程的编程通常可以或许带来更好的性能和用户体验,但是多线程的步调对于其他步调是不友爱的,因为它可能占用了更多的CPU资源。固然,也不是线程越多,步调的性能就越好,因为线程之间的调理和切换也会浪费CPU时间。时下很时髦的 Node.js就接纳了单线程异步I/O的工作模式。 3、请解释怎样配置Tomcat来使用IIS和NTLM ?
必须遵照isapi_redirector.dll的标准指令
配置IIS使用“集成windows验证”
确保在服务器.xml中您已经禁用了tomcat身份验证
4、Java中的继续是单继续还是多继续
Java中既有单继续,又有多继续。对于java类来说只能有一个父类,对于接口来说可以同时继续多个接口
5、事务的使用场景在什么地方?
但一个业务逻辑包括多个数据库操作的时候,而且必要包管每个数据表操作都实行的成功进行下一个操作,这个时候可以使用事务
6、说一下垃圾分代网络的过程
分为新生代和老年代,新生代默认占总空间的 1/3,老年代默认占 2/3。
新生代使用复制算法,有 3 个分区:Eden、To Survivor、From Survivor,它们的默认占比是 8:1:1。
当新生代中的 Eden 区内存不敷时,就会触发 Minor GC,过程如下:
1、 在 Eden 区实行了第一次 GC 之后,存活的对象会被移动到其中一个 Survivor 分区;
2、 Eden 区再次 GC,这时会接纳复制算法,将 Eden 和 from 区一起清算,存活的对象会被复制到 to 区;
3、 移动一次,对象年龄加 1,对象年龄大于一定阀值会直接移动到老年代
4、 Survivor 区雷同年龄所有对象巨细的总和 (Survivor 区内存巨细 * 这个目的使用率)时,大于或即是该年龄的对象直接进入老年代。其中这个使用率通过 -XX:TargetSurvivorRatio 指定,默认为 50%
5、 Survivor 区内存不敷会发生包管分配
6、 超过指定巨细的对象可以直接进入老年代
Major GC,指的是老年代的垃圾清算,但并未找到明白阐明何时在进行Major GC
FullGC,整个堆的垃圾网络,触发条件:
1、 每次晋升到老年代的对象平均巨细>老年代剩余空间
2、 MinorGC后存活的对象超过了老年代剩余空间
3、 元空间不敷
4、 System.gc() 可能会引起
5、 CMS GC异常,promotion failed:MinorGC时,survivor空间放不下,对象只能放入老年代,而老年代也放不下造成;concurrent mode failure:GC时,同时有对象要放入老年代,而老年代空间不敷造成
6、 堆内存分配很大的对象
7、可以直接调用Thread类的run ()方法么?
固然可以。但是如果我们调用了Thread的run()方法,它的行为就会和普通的方法一样,会在当前线程中实行。为了在新的线程中实行我们的代码,必须使用Thread.start()方法。
8、Math.round(11.5) 即是多少?Math.round(-11.5)即是多少?
Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后进行下取整。
9、字节流与字符流的区别
1、 以字节为单位输入输出数据,字节流按照8位传输
2、 以字符为单位输入输出数据,字符流按照16位传输
10、Java 堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)
JVM 的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在 JVM 启动的时候被创建。对象所占的堆内存是由主动内存管理系统也就是垃圾网络器回收。
堆内存是由存活和殒命的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。殒命的对象是应用不可访问尚且还没有被垃圾网络器回收掉的对象。不停到垃圾网络器把这些 对象回收掉之前,他们会不停占据堆内存空间。
11、类加载为什么要使用双亲委派模式,有没有什么场景是冲破了这个模式?
双亲委托模型的紧张用途是为相识决类载入过程中的安全性问题。
1、 假设有一个开发者自己编写了一个名为java.lang.Object的类,想借此欺骗JVM。如今他要使用自界说ClassLoader来加载自己编写的java.lang.Object类。
2、 然而幸运的是,双亲委托模型不会让他成功。因为JVM会优先在Bootstrap ClassLoader的路径下找到java.lang.Object类,并载入它
Java的类加载是否一定遵照双亲委托模型?
1、 在实际开发中,我们可以通过自界说ClassLoader,并重写父类的loadClass方法,来冲破这一机制。
2、 SPI就是冲破了双亲委托机制的(SPI:服务提供发现)。
12、生产情况 CPU 占用过高,你怎样解决?
1、 top + H 指令找出占用 CPU 最高的进程的 pid
2、 top -H -p
在该进程中找到,哪些线程占用的 CPU 最高的线程,记载下 tid
3、 jstack -l
threads.txt,导出进程的线程栈信息到文本,导出出现异常的话,加上 -F 参数
4、 将 tid 转换为十六进制,在 threads.txt 中搜索,查到对应的线程代码实行栈,在代码中查找占 CPU 比力高的原因。其中 tid 转十六进制,可以借助 Linux 的 printf "%x" tid 指令
我用上述方法查到过,jvm 多条线程疯狂 full gc 导致的CPU 100% 的问题和 JDK1.6 HashMap 并发 put 导致线程 CPU 100% 的问题
13、JVM 的内存模型是什么?
JVM 试图界说一种统一的内存模型,能将各种底层硬件以及操作系统的内存访问差异进行封装,使 Java 步调在差别硬件以及操作系统上都能到达雷同的并发效果。它分为工作内存和主内存,线程无法对主存储器直接进行操作,如果一个线程要和别的一个线程通讯,那么只能通过主存进行交换。
14、你知道哪些GC范例?
Minor GC:发生在年轻代的 GC。Major GC:发生在老年代的 GC。Full GC:全堆垃圾回收。比如 Metaspace 区引起年轻代和老年代的回收。
15、怎样判断一个常量是废弃常量 ?
运行时常量池主要回收的是废弃的常量。如果在常量池中存在字符串 "abc",如果当前没有任何 String 对象引用该字符串常量的话,就阐明常量 "abc" 就是废弃常量,如果这时发生内存回收的话而且有必要的话,"abc" 就会被系统清算出常量池。
16、对象的内存结构相识吗?
对象在堆内存的存储结构可分为对象头、实例数据和对齐添补。
对象头占 12B,包括对象标记和范例指针。对象标记存储对象自身的运行时数据,如哈希码、GC 分代年龄、锁标记、偏向线程 ID 等,这部分占 8B,称为 Mark Word。Mark Word 被设计为动态数据结构,以便在极小的空间存储更多数据,根据对象状态复用存储空间。
范例指针是对象指向它的范例元数据的指针,占 4B。JVM 通过该指针来确定对象是哪个类的实例。
实例数据是对象真正存储的有用信息,即本类对象的实例成员变量和所有可见的父类成员变量。存储顺序会受到虚拟机分配策略参数和字段在源码中界说顺序的影响。雷同宽度的字段总是被分配到一起存放,在满意该前提条件的情况下父类中界说的变量会出如今子类之前。
对齐添补不是必然存在的,仅起占位符作用。虚拟机的主动内存管理系统要求任何对象的巨细必须是 8B 的倍数,对象头已被设为 8B 的 1 或 2 倍,如果对象实例数据部分没有对齐,必要对齐添补补全。
17、Java对象的结构相识过吗?
对象头区域此处存储的信息包括两部分:1、对象自身的运行时数据( MarkWord ),占8字节 存储 hashCode、GC 分代年龄、锁范例标记、偏向锁线程 ID 、 CAS 锁指向线程 LockRecord 的指针等, synconized 锁的机制与这个部分( markwork )密切相干,用 markword 中最低的三位代表锁的状态,其中一位是偏向锁位,别的两位是普通锁位。2、对象范例指针( Class Pointer ),占4字节 对象指向它的类元数据的指针、 JVM 就是通过它来确定是哪个 Class 的实例。
实例数据区域 此处存储的是对象真正有用的信息,比如对象中所有字段的内容
对齐添补区域 JVM 的实现 HostSpot 规定对象的起始所在必须是 8 字节的整数倍,换句话来说,如今 64 位的 OS 往外读取数据的时候一次性读取 64bit 整数倍的数据,也就是 8 个字节,所以 HotSpot 为了高效读取对象,就做了"对齐",如果一个对象实际占的内存巨细不是 8byte 的整数倍时,就"补位"到 8byte 的整数倍。所以对齐添补区域的巨细不是固定的。
这套Java面试题大全,希望对大家有帮助哈~
博主已将以下这些面试题整理成了一个面试手册,是PDF
18、谈谈双亲委派模型
1、 Parents Delegation Model,这里的 Parents 翻译成双亲有点不当,类加载向上通报的过程中只有单亲;parents 更多的是多级向上的意思。
2、 除了顶层的启动类加载器,其他的类加载器在加载之前,都会委派给它的父加载器进行加载,一层层向上通报,直到所有父类加载器都无法加载,自己才会加载该类。
3、 双亲委派模型,更好地解决了各个类加载器协作时底子类的同等性问题,制止类的重复加载;防止焦点API库被随意篡改。
JDK 9 之前
1、 启动类加载器(Bootstrp ClassLoader),加载 /lib/rt.jar、-Xbootclasspath
2、 扩展类加载器(Extension ClassLoader)sun.misc.Launcher$ExtClassLoader,加载 /lib/ext、java.ext.dirs
3、 应用步调类加载器(Application ClassLoader,sun.misc.Launcher$AppClassLoader),加载 CLASSPTH、-classpath、-cp、Manifest
4、 自界说类加载器
JDK 9 开始 Extension ClassLoader 被 Platform ClassLoader 取代,启动类加载器、平台类加载器、应用步调类加载器全都继续于 jdk.internal.loader.BuiltinClassLoader
类加载代码逻辑
protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { // 首先,检查请求的类是否已经被加载过了 Class c = findLoadedClass(name); if (c == null) { try { if (parent != null) { c = parent.loadClass(name, false); } else { c = findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { // 如果父类加载器抛出ClassNotFoundException // 阐明父类加载器无法完成加载请求 } if (c == null) { // 在父类加载器无法加载时 // 再调用本身的findClass方法来进行类加载 c = findClass(name); } } if (resolve) { resolveClass(c); } return c; }
19、CMS分为哪几个阶段?
CMS已经弃用。生活优美,时间有限,不发起再深入研究了。如果碰到问题,直接祭出回收过程即可。
1、 初始标记
2、 并发标记
3、 并发预清算
4、 并发可取消的预清算
5、 重新标记
6、 并发清算
由于《深入理解java虚拟机》一书的盛行,面试时省略3、4步一般也是没问题的。
20、解释 Java 堆空间及 GC?
当通过 Java 命令启动 Java 进程的时候,会为它分配内存。内存的一部分用于创建堆空间,当步调中创建对象的时候,就从对空间中分配内存。GC 是 JVM 内部的一个进程,回收无效对象的内存用于将来的分配。
21、ZGC 相识吗?
JDK11 中到场的具有实验性质的低延迟垃圾网络器,目的是尽可能在不影响吞吐量的前提下,实如今任意堆内存巨细都可以把停顿时间限制在 10ms 以内的低延迟。
基于 Region 内存结构,不设分代,使用了读屏蔽、染色指针和内存多重映射等技术实现可并发的标记-整理,以低延迟为首要目的。
ZGC 的 Region 具有动态性,是动态创建和销毁的,并且容量巨细也是动态变化的。
22、safepoint是什么?
STW并不会只发生在内存回收的时候。如今步调员这么卷,碰到几次safepoint的问题几率也是比力大的。
当发生GC时,用户线程必须全部停下来,才可以进行垃圾回收,这个状态我们可以认为JVM是安全的(safe),整个堆的状态是稳定的。
如果在GC前,有线程迟迟进入不了safepoint,那么整个JVM都在等待这个壅闭的线程,造成了整体GC的时间变长。
23、JVM 提供的常用工具
jps:
用来显示本地的 Java 进程,可以查看本地运行着几个 Java 步调,并显示他们的进程号。 命令格式:jps
jinfo:
运行情况参数:Java System 属性和 JVM 命令行参数,Java class path 等信息。 命令格式:jinfo 进程 pid
jstat:
监视虚拟机各种运行状态信息的命令行工具。 命令格式:jstat -gc 123 250 20
jstack:
可以观察到 JVM 中当前所有线程的运行情况和线程当前状态。 命令格式:jstack 进程 pid
jmap:
观察运行中的 JVM 物理内存的占用情况(如:产生哪些对象,及其数目)。 命令格式:jmap [option] pid
24、CMS 网络器(多线程标记清除算法)
Concurrent mark sweep(CMS)网络器是一种大哥代垃圾网络器,其最主要目的是获取最短垃圾回收停顿时间, 和其他大哥代使用标记-整理算法差别,它使用多线程的标记-清除算法。最短的垃圾网络停顿时间可以为交互比力高的步调提高用户体验。CMS 工作机制相比其他的垃圾网络器来说更复杂。整个过程分为以下 4 个阶段:
初始标记
只是标记一下 GC Roots 能直接关联的对象,速度很快,仍旧必要停息所有的工作线程。
并发标记
进行 GC Roots 跟踪的过程,和用户线程一起工作,不必要停息工作线程。
重新标记
为了修正在并发标记期间,因用户步调继续运行而导致标记产生变动的那一部分对象的标记记载,仍旧必要停息所有的工作线程。
并发清除
清除 GC Roots 不可达对象,和用户线程一起工作,不必要停息工作线程。由于耗时最长的并发标记和并发清除过程中,垃圾网络线程可以和用户如今一起并发工作, 所以总体上来看CMS 网络器的内存回收和用户线程是一起并发地实行。
25、对象都是优先分配在年轻代上的吗?
不是。当新生代内存不够时,老年代分配包管。而大对象则是直接在老年代分配。
26、有哪些 GC 算法?
标记-清除算法
分为标记和清除阶段,首先从每个 GC Roots 出发依次标记有引用关系的对象,最后清除没有标记的对象。
实行效率不稳定,如果堆包罗大量对象且大部分必要回收,必须进行大量标记清除,导致效率随对象数目增长而低落。
存在内存空间碎片化问题,会产生大量不连续的内存碎片,导致以后必要分配大对象时容易触发 Full GC。
标记-复制算法
为相识决内存碎片问题,将可用内存按容量划分为巨细相称的两块,每次只使用其中一块。当使用的这块空间用完了,就将存活对象复制到另一块,再把已使用过的内存空间一次清算掉。主要用于进行新生代。
实现简单、运行高效,解决了内存碎片问题。代价是可用内存缩小为原来的一半,浪费空间。
HotSpot 把新生代划分为一块较大的 Eden 和两块较小的 Survivor,每次分配内存只使用 Eden 和其中一块 Survivor。垃圾网络时将 Eden 和 Survivor 中仍旧存活的对象一次性复制到另一块 Survivor 上,然后直接清算掉 Eden 和已用过的那块 Survivor。HotSpot 默认Eden 和 Survivor 的巨细比例是 8:1,即每次新生代中可用空间为整个新生代的 90%。
标记-整理算法
标记-复制算法在对象存活率高时要进行较多复制操作,效率低。如果不想浪费空间,就必要有额外空间分配包管,应对被使用内存中所有对象都存活的极度情况,所以老年代一般不使用此算法。
老年代使用标记-整理算法,标记过程与标记-清除算法一样,但不直接清算可回收对象,而是让所有存活对象都向内存空间一端移动,然后清算掉边界以外的内存。
标记-清除与标记-整理的差异在于前者是一种非移动式算法而后者是移动式的。如果移动存活对象,尤其是在老年代这种每次回收都有大量对象存活的区域,是一种极为负重的操作,而且移动必须全程停息用户线程。如果不移动对象就会导致空间碎片问题,只能依赖更复杂的内存分配器和访问器解决。
27、有什么堆外内存的排查思绪?
进程占用的内存,可以使用top命令,看RES段占用的值。如果这个值大大超出我们设定的最大堆内存,则证明堆外内存占用了很大的区域。
使用gdb可以将物理内存dump下来,通常能看到里面的内容。更加复杂的分析可以使用perf工具,大概谷歌开源的gperftools。那些申请内存最多的native函数,很容易就可以找到。
28、SWAP会影响性能么?
当操作系统内存不敷的时候,会将部分数据写入到SWAP交换分中,但是SWAP的性能是比力低的。如果应用的访问量较大,必要频繁申请和销毁内存,就容易发生卡顿。一般高并发场景下,会禁用SWAP。
29、你知道哪些JVM性能调优
设定堆内存巨细
1、 -Xmx:堆内存最大限制。设定新生代巨细。新生代不宜太小,否则会有大量对象涌入老年代
2、 -XX:NewSize:新生代巨细
3、 -XX:NewRatio 新生代和老生代占比
4、 -XX:SurvivorRatio:伊甸园空间和幸存者空间的占比
5、 设定垃圾回收器 年轻代用 -XX:+UseParNewGC 大哥代用-XX:+UseConcMarkSweepGC
30、你都有哪些本领用来排查内存溢出?
(这个话题很大,可以从实践环节中随便摘一个进行总结,下面举例一个最普通的)
你可以来一个中规中矩的回
内存溢出包罗许多种情况,我在平常工作中遇到最多的就是堆溢出。有一次线上遇到故障,重新启动后,使用jstat命令,发现Old区在不停增长。我使用jmap命令,导出了一份线上堆栈,然后使用MAT进行分析。通过对GC Roots的分析,我发现了一个非常大的HashMap对象,这个本来是有位同砚做缓存用的,但是一个无界缓存,造成了堆内存占用不停上升。后来,将这个缓存改成 guava的Cache,并设置了弱引用,故障就消失了。
已经整理成7000多页,面试手册PDF版已经整理成7000多页,面试手册PDF版https://mp.weixin.qq.com/s/TMBjoux5tpcqmbEFR-pDrA
这个回答不是十分出彩,但着实是常见问题,让人挑不出毛病。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |