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

大数据开发(Java面试真题)

  • 1、讲一下 JVM 的垃圾回收的相关概念?
  • 2、JVM 常见调优方法有哪些?
  • 3、请解释下Java中的线程池是什么,如何使用线程池来提高程序的性能?
  • 4、请解释Java中HashMap和HashTable的区别?
  • 5、什么是JVM垃圾回收?Java中有几种垃圾回收算法?
  • 6、请解释下Java中的String、StringBuilder和StringBuffer的区别?
  • 7、Java的垃圾回收机制是什么?简要描述它的工作原理
  • 8、Java的内存区域分为几个部分?
  • 9、什么情况下Java新建的对象不存储在Eden中?
  • 10、Java中ThreadLocal的原理是什么?

1、讲一下 JVM 的垃圾回收的相关概念?

Java 虚拟机的垃圾回收是 Java 内存管理的一个重要部分,它负责自动化地管理 Java 程序的内存,通过识别和回收不再使用的对象来释放内存。垃圾回收器在程序运行时进行,尽管开发者无法直接控制其精确的运行时间,但可以通过编写“内存友好”的代码以及调整 JVM 配置参数来影响其行为。

以下是关于 JVM 垃圾回收的一些基本概念:
对象的生命周期Java 对象的生命周期开始于创建(当使用 new 关键字时)并在不再有引用指向它们时结束。如果一个对象不再被引用,那么它就可能被垃圾回收。
堆(Heap)内存Java 对象存储在堆内存中。堆在 JVM 启动时创建,可以通过 JVM 参数调整其大小。
垃圾回收算法:垃圾回收器使用特定的算法来确定哪些对象可以被视为"垃圾"并进行回收。常见的垃圾回收算法有标记-清除、标记-压缩、复制、以及分代回收等。
停顿时间垃圾回收器在运行时,通常会导致 Java 应用程序的执行暂停,这种现象被称为“停顿时间”。减少停顿时间是垃圾回收器优化的一个重要目标。
分代回收Java 的垃圾回收器通常采用分代回收策略,将堆内存分为新生代和老年代。这种策略基于这样一个观察:大多数对象的生命周期都很短。
新生代新创建的对象首先放在新生代。新生代通常分为一个 Eden 区和两个 Survivor 区(S0和 S1)。大部分对象在 Eden 区被垃圾回收
老年代如果对象在新生代中存活了足够长的时间,它们会被移动到老年代。老年代的空间通常比新生代大,并且其垃圾回收频率较低
垃圾回收器:Java 提供了多种垃圾回收器,包括 Serial、Parallel、CMS、G1以及 ZGC等。每种垃圾回收器都有其特定的使用场景和优劣,选择哪种垃圾回收器取决于具体的应用需求。

2、JVM 常见调优方法有哪些?

内存分配扩大 JVM 堆的大小可以提供更多的空间给对象,减少垃圾回收(GC)的次数。使用-Xms 和-Xmx 参数可以分别设置堆的初始大小和最大大小。然而,分配过多的内存可能会导致更长的 GC 停顿时间,并可能影响其他进程的性能。

选择垃圾回收器:根据应用的需求和特性选择合适的垃圾回收器。例如,对于需要低延迟的实时系统,选择并发垃圾回收器(如 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的基本工作原理:

  1. 内部存储:每个Thread都有一个ThreadLocalMap类型的成员变量ThreadLocals,这个变量是ThreadLocal的内部类。
  2. ThreadLocalMap的键为ThreadLocal对象,值为线程局部变量:也就是说,ThreadLocal本身并不存储值,它只是作为一个key来帮助线程从ThreadLocalMap获取一个线程局部变量
  3. get()方法:当调用ThreadLocal的get()方法时,实际上是去调用Thread.currentThread().getThreadLocalMap().get(this)。这个操作就是获取当前线程的threadLocals成员变量,然后以当前ThreadLocal实例作为key,去获取线程局部变量
  4. set()方法:当调用ThreadLocal的set()方法时,实际上是去调用Thread.currentThread().getThreadLocalMap().set(this,value)。这个操作就是获取当前线程的threadLocals成员变量,然后以当前ThreadLocal实例作为key,和将要存储的值作为value,存入ThreadLocalMap中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/726728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LVS集群(Linux Virtual server)

集群概念lvs模型lvs调度算法lvs实现lvs高可用性,负载均衡 1 集群和分布式 系统性能扩展方式: Scale UP:垂直扩展,向上扩展,增强,性能更强的计算机运行同样的服务 升级单机的硬件设备Scale Out:水平扩展…

Linux Ubuntu系统安装MySQL并实现公网连接本地数据库【内网穿透】

文章目录 前言1 .安装Docker2. 使用Docker拉取MySQL镜像3. 创建并启动MySQL容器4. 本地连接测试4.1 安装MySQL图形化界面工具4.2 使用MySQL Workbench连接测试 5. 公网远程访问本地MySQL5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主…

el-table 插入单选并进行校验

<template><div><el-form :model"list" ref"ruleForm"><el-table :data"list.tableData" style"width: 100%"><el-table-column prop"time" label"日期" width"180"><…

STM32 学习9 中断、外部中断及定时器中断

STM32 学习9 中断、外部中断及定时器中断 一、STM32中断介绍一、STM32中断介绍1. 什么是中断&#xff1f;2. 中断在嵌入式系统中的作用和重要性3. STM32中断的概述 4. 中断的优先级4.1 中断优先级级别4.2 中断优先级分类&#xff08;1&#xff09;硬件优先级&#xff08;2&…

挑战杯 基于深度学习的目标检测算法

文章目录 1 简介2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 1 简介 &#x1f5…

Nuxt2升级Nuxt3指南(二):nuxt.config.js配置文件

一、代码移植原则 前置说明&#xff1a;根据项目开发的实际情况&#xff0c;本次升级不采用Typescript。 升级的原则是开始尽量的简单配置&#xff0c;将代码分阶段逐步移植到新版本框架上&#xff0c;遇到问题逐一排查解决。 大致阶段&#xff0c;可以分为&#xff1a; 第一…

在idea中如何开启项目的热部署

热部署&#xff1a;就是当我们IDEA的项目在运行期间&#xff0c;我们修改代码以后&#xff0c;不需要我们自己重启项目&#xff0c;IDEA就会自动的重启项目 在idea中开启项目热部署的步骤 第一步&#xff1a;引入热部署的依赖 <dependency><groupId>org.springfr…

STP---生成树协议

STP的作用 a)Stp通过阻塞端口来消除环路&#xff0c;并能够实现链路备份目的 b)消除了广播风暴 c)物理链路冗余&#xff0c;网络变成了层次化结构的网络 STP操作 选举一个根桥每个非根交换机选举一个根端口每个网段选举一个指定端口阻塞非根&#xff0c;非指定端口 STP--生成树…

基于单片机的智能空调设计

目 录 摘 要 I Abstract II 引 言 1 1 系统整体设计 3 1.1 系统方案设计 3 1.2 系统工作原理 3 2 硬件设计 5 2.1 电源模块设计 5 2.1.1 电源模块选择 5 2.1.2 电源模块电路设计 5 2.2 单片机模块设计 5 2.2.1 单片机型号选择 5 2.2.2 单片机模块电路设计 6 2.3 按键模块设计 …

突破编程_C++_字符串算法(检查一个字符串是否是某个字符串的旋转)

1 算法题 &#xff1a;检查一个字符串是否是某个字符串的旋转 1.1 题目含义 检查一个字符串是否是某个字符串的旋转&#xff0c;这是一个常见的字符串操作问题。具体来说&#xff0c;这个问题要求判断给定的一个字符串是否可以通过将另一个字符串的所有字符按照相同的顺序进行…

SpringBoot 线程池异步调用

yml配置文件 # 线程池 threadPool:# 核心线程池大小corePoolSize: 2# 最大线程数maxPoolSize: 5# 缓冲队列大小queueCapacity: 200# 允许线程空闲时间&#xff08;单位&#xff1a;默认为秒&#xff09;keepAliveSeconds: 10# 允许线程等待时长&#xff08;单位&#xff1a;默…

vue3中el-input输入无效的原因之一

表单的model用的是&#xff1a;reactive let updateForm reactive({ id: 0, className: "" }); reactive的数据不能这么赋值&#xff0c;会破坏响应性 错误方法&#xff08;&#xff09;{ updateForm { id: 0, className: "asdasdas" }; } 解决方法&…

Qt + mqtt对接阿里云平台(二)

一、MQTT协议 1、MQTT相关概念 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&#xff09;模式的"轻量级"通讯协议&#xff0c;该协议构建于TC…

移动目标检测的几种常用方法和代码实现

移动目标检测的几种常用方法和代码实现 帧差法&#xff08;Frame Difference Method&#xff09;持续帧差法&#xff08;Continuous Frame Difference Method&#xff09;总结背景减法自适应背景减法总结 帧差法和持续帧差法都是通过分析视频帧之间的差异来检测场景中的运动对象…

1.5如何缓解图像分类任务中训练数据不足带来的问题?

1.5 图像数据不足时的处理方法 场景描述 在机器学习中&#xff0c;绝大部分模型都需要大量的数据进行训练和学习(包括有监督学习和无监督学习)&#xff0c;然而在实际应用中经常会遇到训练数据不足的问题。 比如图像分类&#xff0c;作为计算机视觉最基本的任务之一&#xff0…

生成 Linux/ubuntu/Debian 上已安装软件包的列表

你可以在终端中使用以下命令生成已安装软件包的列表&#xff1a; 列出所有已安装的软件包&#xff1a; dpkg --get-selections要将列表保存到文件中&#xff1a; dpkg -l > installed_packages_detailed.txt这将在当前目录中创建一个名为“installed_packages_detailed.txt”…

高效提升控制效率 | 基于ACM32 MCU的LED灯箱控制器方案

LED灯箱上各种文字、图案有序跳跃、交替辉映&#xff0c;产生强烈的视觉冲击力&#xff0c;被广泛应用于商场、美容美发、宾馆、娱乐场所等地方。 锁存器的工作原理 在LED和数码管显示方面&#xff0c;要维持一个数据的显示&#xff0c;往往要持续的快速的刷新。尤其是在四段八…

Python算法100例-3.6 自守数

1.问题描述2.问题分析3.算法设计4.求给定数的位数5.分离给定数中的最后几位6.确定程序框架7.完整的程序 1&#xff0e;问题描述 自守数是指一个数的平方的尾数等于该数自身的自然数。例如&#xff0c; 5 2 25 &#xff0c; 2 5 2 625 &#xff0c; 7 6 2 5776 &#xff0c…

java基础-锁之volatilesynchronized

文章目录 volatilevolatile内存语义volatile的可见性volatile无法保证原子性volatile禁止重排优化硬件层的内存屏障volatile内存语义的实现下面是基于保守策略的JMM内存屏障插入策略。下面是保守策略下&#xff0c;volatile写插入内存屏障后生成的指令序列示意图下图是在保守策…

Mac下java环境搭建

JDK 教程:MAC安装JDK及环境变量配置-CSDN博客 建议JDK7和JDK8都装上,因为一些老项目是用JDK7开发,使用JDK8编译时报错。(若没有老项目,直接安装jdk8) 若配置环境变量时找不到JDK的安装路径,有两种方式: 方式一、mac默认位置为:/Library/Java/JavaVirtualMachines/…