2023年精选出来的Java后端面试题

这篇具有很好参考价值的文章主要介绍了2023年精选出来的Java后端面试题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、Java与C++的区别?

Java源码会先经过编译器编译成字节码(class文件),然后由JVM中内置的解释器解释成机器码。而C++源码直径过一次编译,直接在编译的过程中链接了,形成机器码

C++比Java执行效率快,但是Java可以利用JVM跨平台

Java是纯面向对象的语言,所有代码都必须在勒种定义。而C++中还有面向过程的东西,比如全局变量和全局函数

C++中有指针,Java中没有,但是有引用

C++支持多继承,Java类都是单继承。但是继承都有传递性,同时Java中的接口是多继承,接口可以多实现

Java 中内存的分配和回收由Java虚拟机实现。Java 中有垃圾自动回收机制,会自动清理引用数为0的对象。而在 C++ 编程时,则需要花精力考虑如何避免内存泄漏。

C++运算符可以重载,但是Java中不可以。同时C++中支持强制自动转型,Java中不行,会出现ClassCastException(类型不匹配)。

2、Java堆内存和栈内存的区别

Java把内存分成两种,一种叫做栈内存,一种叫做堆内存。

在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。

堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。

引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!

3、Java的垃圾回收机制,什么时候会出现Full GC

由于Java有垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存。

ps:内存泄露是指该内存空间使用完毕之后未回收

什么情况下回导致内存泄漏?

1.静态集合类像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将一直被Vector等应用着。

2.各种连接,数据库连接,网络连接,IO连接等没有显示调用close关闭,不被GC回收导致内存泄露。

3.监听器的使用,在释放对象的同时没有相应删除监听器的时候也可能导致内存泄露。

Java分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的回收算法,以便提高回收效率。

分为三代:

①年轻代。

1.所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。

2.新生代内存按照8:1:1的比例分为一个eden区和两个survivor(survivor0,survivor1)区。一个Eden区,两个 Survivor区(一般而言)。大部分对象在Eden区中生成。回收时先将eden区存活对象复制到一个survivor0区,然后清空eden区,当这个survivor0区也存放满了时,则将eden区和survivor0区存活对象复制到另一个survivor1区,然后清空eden和这个survivor0区,此时survivor0区是空的,然后将survivor0区和survivor1区交换,即保持survivor1区为空, 如此往复。

3.当survivor1区不足以存放 eden和survivor0的存活对象时,就将存活对象直接存放到老年代。若是老年代也满了就会触发一次Full GC,也就是新生代、老年代都进行回收

4.新生代发生的GC也叫做Minor GC,MinorGC发生频率比较高(不一定等Eden区满了才触发)

②年老代。

1.在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

2.内存比新生代也大很多(大概比例是1:2),当老年代内存满时触发Major GC即Full GC,Full GC发生频率比较低,老年代对象存活时间比较长,存活率标记高。

③持久代

用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。

不同的收集器采用的算法不一样,如复制算法,标记-整理算法,标记-复制算法,停止-复制算法。

新生代收集器使用的收集器:Serial(复制算法)、PraNew(停止-复制算法)、Parallel Scavenge(停止-复制算法)

老年代收集器使用的收集器:Serial Old(标记-整理算法)、Parallel Old(停止-复制算法)、CMS(标记-清理算法)。

由于对象进行了分代处理,因此垃圾回收区域、时间也不一样。

GC有两种类型:Scavenge GC和Full GC。

Scavenge GC

一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。因而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲出来。

Full GC

对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个堆进行回收,所以比Scavenge GC要慢,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节。

有如下原因可能导致Full GC:

1.年老代(Tenured)被写满

2.持久代(Perm)被写满

3.System.gc()被显示调用

4.上一次GC之后Heap的各域分配策略动态变化

以上就是“2023年精选出来的Java后端面试题”,你能回答上来吗?如果想要了解更多的Java面试题相关内容,可以加扣扣裙390144688文章来源地址https://www.toymoban.com/news/detail-492483.html

到了这里,关于2023年精选出来的Java后端面试题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2023 Java 面试题精选40道,包含答案

    Java中什么是重载?什么是覆盖?它们有什么区别? 重载是指在同一个类中,方法名相同但参数类型、个数或顺序不同的情况下,编译器会根据参数列表的不同自动调用不同的方法。 覆盖是指子类重写父类的同名方法,使得子类在调用该方法时执行子类的实现而不是父类的实

    2024年02月14日
    浏览(48)
  • 金三银四互联网大厂秋招精选 1160 道 Java 面试题答案整理(2023 最新版)

    今年的大环境而言,面试成功的难度比往年高了很多,很明显的感受就是:对于今年的 java 开发朋友面试, 无论一面还是二面,都开始考验一个 Java 程序员的技术功底和基础。 Java 基础掌握不牢,对于一个开发人员来说无疑是非常致命的。学习任何一个技术知识无疑不是从基

    2024年02月09日
    浏览(58)
  • 华为OD机试 -矩阵扩散(Java) | 机试题+算法思路+考点+代码解析 【2023】

    存在一个mn的二维数组,其成员取值范围为0或1。其中值为1的成员具备扩散性,每经过1S,将上下左右值为0的成员同化为1。二维数组的成员初始值都为0,将第[i,j]和[k,l]两个个位置上元素修改成1后,求矩阵的所有元素变为1需要多长时间。 输入描述: 输出数据中的前2个数字表

    2024年02月16日
    浏览(58)
  • 华为OD机试 -矩阵最大值(Java) | 机试题+算法思路+考点+代码解析 【2023】

    给定一个仅包含0和1的N*N二维矩阵,请计算二维矩阵的最大值,计算规则如下: 1、 每行元素按下标顺序组成一个二进制数(下标越大越排在低位),二进制数的值就是该行的值。矩阵各行值之和为矩阵的值。 2、允许通过向左或向右整体循环移动每行元素来改变各元素在行中

    2024年02月13日
    浏览(53)
  • 【后端面经-计算机基础】HTTP和TCP的区别

    目录 【后端面经-计算机基础】HTTP和TCP的区别 1. OSI七层模型和相关协议 2. TCP协议 2.1 特点: 2.2 报文格式 2.3 三次握手和四次挥手 3. HTTP协议 3.1 特点 3.2 报文格式 3.2 https和http 4. HTTP vs TCP 5. 面试模拟 参考资料 在计算机网络的学习中,OSI七层结构是一个很重要的概念。 七层模

    2024年02月12日
    浏览(53)
  • 【后端面经】MySQL主键、唯一索引、联合索引的区别和作用

    目录 0. 简介 1. 主键 2. 唯一索引 3. 联合索引 4. 索引对数据库操作的影响 5. 其他索引 5.1 普通索引 5.2 全文索引 5.3 前缀索引 6. 总结 7. 参考资料 索引是一类特殊的 文件 ,用来存储检索信息,使数据库查找更加快速。 主键是一类特殊的唯一索引,选择某一列元素作为主键,用

    2024年02月09日
    浏览(44)
  • 【后端面经-Java】Java基本概念

    目录 【后端面经-Java】Java基本概念 1. 面向对象和面向过程 1.1 概念 1.2 优缺点对比 2. C++和Java的区别 2.1 \\\"去其糟粕\\\"——Java同学,你对C++的这些东西有什么意见? 2.2 改进之处————Java同学,你的这个论文,,,创新点是什么? 面试模拟 参考资料 面向过程:将一个事件拆分

    2024年02月16日
    浏览(40)
  • 【React】每日精选5题 2023-7-6

    可以使用JavaScript的typeof运算符和React的Component类来进行判断。 代码示例: 上面定义了一个名为isClassComponent的函数,它接受一个组件作为参数。函数内部使用typeof运算符来判断该组件是否为函数类型,并通过检查component.prototype.isReactComponent属性来确定是否为Class组件。 useRef、

    2024年02月13日
    浏览(33)
  • 【React】每日精选5题 2023-7-14

    React.memo() 和 JS 的 memorize 函数都是用来对函数进行结果缓存,提高函数的性能表现。不过,它们之间还是有一些区别的: 适用范围不同 :React.memo() 主要适用于优化 React 组件的性能表现,而 memorize 函数可以用于任何 JavaScript 函数的结果缓存。 实现方式不同 :React.memo() 是一

    2024年02月16日
    浏览(36)
  • 【后端面经-Java】AQS详解

    目录 1. AQS是什么? 2. AQS核心思想 2.1 基本框架 2.1.1 资源state 2.1.2 CLH双向队列 2.2 AQS模板 3. 源码分析 3.1 acquire(int) 3.1.1 tryAcquire(int) 3.1.2 addWaiter(Node.EXCLUSIVE) 3.1.3 acquireQueued(Node node, int arg) 3.2 release(int) 3.2.1 tryRelease(int) 3.2.2 unparkSuccessor(h) 3.3 acquireShared(int)和releaseShared(int) 3.3.1 acq

    2024年02月11日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包