大数据开发(Java面试真题-卷一)(1)

选择垃圾回收器:根据应用的需求和特性选择合适的垃圾回收器。例如,对于需要低延迟的实时系统,选择并发垃圾回收器(如 CMS 或 G1)可能是个好选择。对于可以容忍更长 GC 停顿时间的批处理任务,使用并行垃圾回收器可能更为合适。
调整新生代和老年代的比例:JVM 的堆内存被划分为新生代和老年代,其中新生代通常分为 Eden 区和两个 Survivor 区(S0和 S1)。这些区域的大小可以通过参数-XX:NewRatio,-XX:SurvivorRatio 进行调整。这种调整可以根据应用的对象生命周期进行,以减少 GC 的次数。
调整线程堆栈大小:使用-Xss 参数可以设置每个线程的堆栈大小。如果应用创建了大量的线程,减小线程堆栈大小可能会帮助减少内存消耗。
启用类数据共享:类数据共享可以加快 JVM 启动速度并减少内存消耗。可以通过-XX:+UseSharedSpaces 参数启用 CDS。
使用 JVM 内建工具进行监控和故障排查:JVM 提供了一些内建工具,如 JConsole, VisualVM, jstat 等,可以用于监控 JVM 的性能和资源使用情况,帮助定位和解决性能问题。

3、请解释下Java中的线程池是什么,如何使用线程池来提高程序的性能?

Java中的线程池是一种管理和复用线程的机制,可以通过预先创建、管理和重复利用线程对象来优化多线程程序的性能。使用线程池可以减少频繁创建和销毁线程带来的开销,并且可以控制同时执行任务的最大数量。
具体使用方法如下:

  1. 使用’ExecutorService’接口提供的’newFixedThreadPool’方法初始化一个固定大小的线程池。
  2. 创建实现了’Runnable’接口的任务。
  3. 将任务提交给线程池处理,调用’submit()'方法提交任务。
  4. 线程池会自动分配可用于处理任务的工作线程,并在执行完后将其放回到缓存队列中等待新任务。
    优点:使用线程池机制可以避免因频繁创建和销毁大量额外开销,能够高效触发系统资源利用率;同时,还可方便地控制并发协同与资源消耗。

4、请解释Java中HashMap和HashTable的区别?

HashMap和HashTable是两个常见的哈希表实现类,在以下几个方面有所不同:

  1. 线程安全性:HashTable是线程安全的,各个方法都有synchronized修饰,适用于多线程环境。而HashMap不是线程安全的,如果多个线程同时访问一个HashMap实例并且至少一个线程修改了Map结构,则必须通过外部同步机制来保证其同步。
  2. 允许空键和空值:HashMap允许插入null键和null值,而HashTable不允许。
  3. 迭代器遍历顺序:HashMap的迭代器是fail-fast的,即在迭代过程中如果其它线程对HashMap进行结构修改(增加或者删除元素),会抛出异常。而HashTable继承自Dictionary类,并不支持迭代器。

5、什么是JVM垃圾回收?Java中有几种垃圾回收算法?

JVM垃圾回收指的是当Java应用程序运行时,自动释放不再使用的对象内存空间,并进行资源回收和整理过程。JVM提供了几种垃圾回收算法:

  1. 标记-清除算法:首先标记所有被引用对象,在清除阶段将未标记的对象释放。
  2. 复制算法:将内存分为相同大小的两块,每次只使用其中的一块。当一块内存用完了之后,将活着的对象复制到另一块内存上,并清除原来使用过的内存。
  3. 标记-整理算法:先标记所有被引用对象,然后将活着的对象移动到一端,最后清除边界以外的对象。
  4. 分代收集算法:根据对象生命周期划分为不同代,在垃圾回收时更关注年轻代,因为大多数新生的对象很快就会死去。这种方式减少了全局垃圾检查和处理时间。

6、请解释下Java中的String、StringBuilder和StringBuffer的区别?

String、StringBuilder和StringBuffer是Java用来操作字符串的类,在以下几个方面有所不同:

  1. 可变性:String类是不可变类,即String对象在创建后其值不能被改变;而StringBuilder和StringBuffer类是可变类,提供了修改和拼接字符串方法。
  2. 线程安全行:String是线程安全的;StringBuilder是非线程安全的;StringBuffer是线程安全但效率相对较低。
  3. 性能效率:由于StringBuilder不是线程安全且没有额外开销,在并发访问场景下比其它两者更高效。如果需要多个线程共享一个字符串缓存区,推荐使用StringBuffer类。
    总的来说,如果需要频繁修改字符串且涉及多线程操作,应使用StringBuffer;如果是单线程操作且需要频繁修改字符串,则选择StringBuilder;而若字符串内存不需要被修改,则使用String更为合适。

7、Java的垃圾回收机制是什么?简要描述它的工作原理

垃圾回收机制是Java自动管理内存的一种方式,它会自动释放不再被引用或无法访问到的对象所占用的内存。
工作原理如下:

  1. 标记阶段:从根对象开始遍历所有可达对象,并标记为“活跃”状态。
  2. 清理阶段:遍历堆内存中所有已分配的对象,将未标记未“活跃”状态的对象清除出堆内存。
  3. 压缩阶段:在清理完毕后,对堆进行整理,消除由于释放了一些空间而产生的碎片。

8、Java的内存区域分为几个部分?

堆(Heap):存放对象实例的地方,包括新生代(Eden区,From Survivor区,To Survivor区)和老年代。
方法区:存储类的结构信息如运行时常量池,字段和方法数据等。
虚拟机栈:存储每个线程的执行信息,包括局部变量、操作数栈、动态链接和方法退出信息。
本地方法栈:为虚拟机使用到的Native方法服务。
程序计数器:指示当前线程正在执行的字节码指令。

9、什么情况下Java新建的对象不存储在Eden中?

  1. 大对象直接进入老年代:所谓的“大对象”是指需要大量连续内存空间的Java对象。例如,很长的字符串或者大的数组。由于Eden区和Survivor区可能无法存放这样大的对象,所以大对象在新建时直接被分配到老年代中。
  2. 长期存活的对象进入老年代:Java的垃圾收集器假设大部分对象都是“照生暮死”的,所以采用了分代收集的方法。当Eden区中的对象在Minor GC(小型垃圾收集)后仍然存活,且年龄(被Minor GC清理的次数)达到一定值(默认15)时,这些对象会被移动到老年代中。这个年龄阈值可以通过-XX:MaxTenuringThreshold参数进行设置。

10、Java中ThreadLocal的原理是什么?

ThreadLocal是Java中的一种线程封闭机制,它可以为每个线程都创建一个独立的变量副本,使得每个线程都可以独立地改变自己地副本,而不会影响其它线程所对应地副本==。ThreadLocal对于实现线程地局部变量以及线程安全十分有用。下面是ThreadLocal的基本工作原理:

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值