【面经】2024秋作业帮Java后端开发岗面经

一 Java语言的优势

  1. 跨平台性(平台独立性):Java程序可以在任何支持Java虚拟机(JVM)的平台上运行,无需重新编译。这种“一次编写,到处运行”的特性极大地提高了Java程序的移植性和可维护性。

  2. 面向对象:Java是一种面向对象的编程语言,它支持封装、继承和多态等面向对象编程的核心概念。这使得Java程序更加模块化,易于管理和扩展。

  3. 健壮性:Java语言在编译和运行时都进行了严格的检查,以消除错误的产生。Java的强类型检查、异常处理、垃圾回收等机制都有助于提高程序的健壮性。

  4. 安全性:Java提供了许多内置的安全特性,如类加载器、安全管理器、加密技术等,以保护系统和用户数据不受恶意软件的攻击。

  5. 多线程支持:Java内置了对多线程的支持,使得并发编程变得相对简单。多线程机制使得Java程序能够同时执行多个任务,提高了程序的执行效率。

  6. 高性能:Java编译器生成的字节码由Java虚拟机(JVM)执行,JVM对字节码进行了优化,以提高程序的执行速度。此外,Java还提供了即时编译器(JIT),可以将经常执行的字节码编译为本地机器码,进一步提高性能。

  7. 分布式计算:Java支持网络编程,并且提供了丰富的API来处理TCP/IP协议。这使得Java程序能够轻松地实现分布式计算,即在网络上的不同计算机之间共享数据和任务。

  8. 丰富的API和开源库:Java拥有庞大的标准库和第三方开源库,涵盖了网络编程、数据库连接、图形用户界面设计等多个方面。这使得Java开发者能够利用这些现成的工具来快速开发应用程序。

  9. 良好的社区支持和文档:Java拥有庞大的开发者社区和丰富的在线资源,包括教程、论坛、开源项目等。这使得Java开发者在遇到问题时能够迅速找到解决方案或获得帮助。

二 如何理解面向对象?

        面向过程是具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步一步的实现。面向对象是模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,我们无需理会。

        面向对象编程具有易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是它的性能比面向过程更低。

三 继承和多态有什么区别?

        继承:子类继承父类中所有的属性和方法,但是对于父类中private的属性和方法,子类不可以访问这些属性和方法的引用。

        多态:父类引用可以持有子类对象。这时候只能调用父类中的方法,而子类中特有方法是无法访问的,也就是说如果父类和子类中有相同的方法时,调用的会是子类中的方法,而不是父类的。

四 Java内存的垃圾回收机制

1.标记-清除法
        流程:利用可达性去遍历内存,标记出所有需要回收的对象;再遍历一遍,将所有标记的对象回收掉。

        特点:效率不稳定,标记和清除两个过程的执行效率都随对象数量增长而降低;内存空间碎片化,标记和清除后会产生大量的不连续的空间分片,可能会导致之后程序运行的时候需分配大对象而找不到连续分片而不得不触发一次GC。

2.标记-复制算法(复制算法)
        将内存按照容量大小分为大小相等的两块,每次只使用一块,当一块使用完了,就将还存活的对象移到另一块上,然后在把使用过的内存空间移除;

        特点:实现简单,运行高效。但是可用内存缩小到了原来的一半。

优化--->>Appel式回收:

        把新生代分为一块较大的Eden空间和两块较小的Survivor空间,每次分配内存只使用Eden和其中一块Survivor。发生垃圾搜集时,将Eden和Survivor中仍然存活的对象一次性复制到另外一块Survivor空间上,然后直接清理掉Eden和已用过的那块Survivor空间。

        HotSpot虚拟机默认Eden和Survivor的大小比例是8∶1,也即每次新生代中可用内存空间为整个新生代容量的90%(Eden的80%加上一个Survivor的10%),只有一个Survivor空间,即10%的新生代是会被“浪费”的。

        Appel式回收还有一个充当罕见情况的“逃生门”的安全设计,当Survivor空间不足以容纳一次Minor GC之后存活的对象时,就需要依赖其他内存区域(实际上大多就是老年代)进行分配担保(Handle Promotion)。

        标记-复制算法在对象存活率较高时就要进行较多的复制操作,效率将会降低。并且如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以在老年代一般不能直接选用这种算法。

3.标记-整理法
        流程:利用可达性去遍历内存,把存活对象或垃圾对象进行标记;将所有的存活的对象向一端移动,将端边界以外的对象都回收掉。

        特点:如果移动存活对象,尤其是在老年代这种每次回收都有大量对象存活区域,移动存活对象并更新所有引用这些对象的地方将会是一种极为负重的操作,而且这种对象移动操作必须全程暂停用户应用程序才能进行,即“Stop The World”。

4.分代收集算法
        根据内存对象的存活周期不同,将内存划分成几块,java虚拟机一般将内存分成新生代和老生代。在新生代中,有大量对象死去和少量对象存活,所以采用复制算法,只需要付出少量存活对象的复制成本就可以完成收集;老年代中因为对象的存活率极高,没有额外的空间对他进行分配担保,所以采用标记清理或者标记整理算法进行回收。

五 垃圾自动回收是怎么判断的?

1. 引用计数算法
        在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;计数器为零的对象就是不可能再被使用的。

---->对象循环引用的问题:无法解决循环引用的问题,当A引用B,B也引用A的时候,此时AB对象的引用都不为0,此时也就无法垃圾回收

2.可达性分析算法
        通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连,则证明此对象是不可能再被使用的。

可以做为GC Roots的对象包括以下几种:

        在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等。

        在方法区中类静态属性引用的对象,譬如Java类的引用类型静态变量
        在方法区中常量引用的对象,譬如字符串常量池(String Table)里的引用。
        在本地方法栈中JNI(即通常所说的Native方法)引用的对象。
        Java虚拟机内部的引用,如基本数据类型对应的Class对象,一些常驻的异常对象(比如NullPointExcepiton、OutOfMemoryError)等,还有系统类加载器。
        所有被同步锁(synchronized关键字)持有的对象。
        反映Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等。

        但一个对象满足上述条件的时候,不会马上被回收,还需要进行两次标记。

----第一次标记:判断当前对象是否有finalize()方法并且该方法没有被执行过,若不存在则标记为垃圾对象,等待回收;若有的话,则进行第二次标记;

----第二次标记:将当前对象放入F-Queue队列,并生成一个finalize线程去执行该方法,虚拟机不保证该方法一定会被执行,因为如果线程执行缓慢或进入了死锁,会导致回收系统的崩溃;如果执行了finalize方法之后仍然没有与GC Roots有直接或者间接的引用,则该对象会被回收。

六 Java的内存管理是怎么做的?

        程序计数器:线程私有的,是一块很小的内存空间,作为当前线程的行号指示器,用于记录当前虚拟机正在执行的线程指令地址;

        虚拟机栈:线程私有的,每个方法执行的时候都会创建一个栈帧,用于存储局部变量表、操作数、动态链接和方法返回等信息,当线程请求的栈深度超过了虚拟机允许的最大深度时,就会抛出StackOverFlowError;

        本地方法栈:线程私有的,保存的是native方法的信息,当一个jvm创建的线程调用native方法后,jvm不会在虚拟机栈中为该线程创建栈帧,而是简单的动态链接并直接调用该方法;

        堆:java堆是所有线程共享的一块内存,几乎所有对象的实例和数组都要在堆上分配内存,因此该区域经常发生垃圾回收的操作;

        方法区:存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码数据。即永久代,在jdk1.8中不存在方法区了,被元数据区替代了,原方法区被分成两部分:加载的类信息和运行时常量池。加载的类信息被保存在元数据区中,运行时常量池保存在堆中。

【面试】面试常考知识点:请你谈谈JVM垃圾收集算法?-CSDN博客

七 全局静态变量与临时变量在内存的什么地方存储

        静态变量位于方法区。 实例变量作为对象的一部分,保存在堆中。 临时变量保存于栈中,栈随线程的创建而被分配。

八 int和long是多少位,多少字节的?

类型字符数位数
byte1字节8
char2字节16
short2字节16
int4字节32
float4字节32
long8字节64
double8字节64
boolean至少1字节----

九 与redis对标的技术有哪些?

        与Redis对标的技术种类繁多,包括内存缓存系统(如Memcached)、NoSQL数据库(如MongoDB、Cassandra、Aerospike、Couchbase)以及分布式流处理平台(如Apache Kafka)等。这些技术各有特点,适用于不同的场景和需求。在选择使用哪种技术时,需要根据具体的应用场景、性能要求、数据模型等因素进行综合考虑。

  • 14
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值