欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 美景 > JAVA面试常见面试问题02

JAVA面试常见面试问题02

2025/4/22 15:52:51 来源:https://blog.csdn.net/yangziqi098/article/details/139611061  浏览:    关键词:JAVA面试常见面试问题02

1、jvm 

内存结构图

对jvm直观的了解

答:

jvm是一个抽象执行环境,它通过加载字节码、实现跨平台运行、管理内存(包括自动垃圾回收)、优化代码执行等,为Java程序提供运行时支持

2、内存泄漏 和 内存溢出

答:

内存泄漏指的是无效对象持续占用内存导致资源浪费

内存溢出则是程序申请内存时超出JVM可用容量

3、sql执行过长的时间,如何优化,从哪些方面?

答:

做索引

explain分析sql语句,查看是否命中多个索引,查看执行计划,分析索引是否用上,分析扫描行数

看是否能进行业务拆分,相关字段冗余或者合并成临时表

用navicat进行分库分表

4、红黑树

答:

红黑树是一种自平衡二叉查找树,通过确保树的高度平衡(logN级别),维持着高效的插入、删除和查找操作(最坏情况O(logN)时间复杂度),其特点是节点有颜色标记(红或黑),遵循特定规则以维护树的平衡性。

5、红黑树在java和mysql中用处

答:

Java中的应用:在Java的标准库中,红黑树用于实现一些需要排序或快速查找的数据结构,例如 TreeMap 和 TreeSet。这些集合类要求元素保持有序,并提供了高效的查找、插入和删除操作。

MySQL中的应用:传统上,MySQL的InnoDB存储引擎并不直接使用红黑树作为其索引结构。相反,InnoDB主要采用B+树作为索引的数据结构,特别是在存储索引和数据时,B+树的特性(如所有实际数据存储在叶子节点,能够很好地支持范围查询和高扇出率)更适合数据库场景。红黑树虽然在某些数据库系统或特定场景下可能作为索引结构(比如较小的内存索引或者特定类型的内部处理),但并不是MySQL InnoDB默认或主要的索引实现方式。

6、HashMap和HashTable的区别?

答:

HashMap和Hashtable的底层实现都是数组+链表结构实现

Hashtable是线程安全,HashMap是非线程安全

两者计算hash的方法不同

7、java中有2个线程,怎么让a线程访问到b线程

答:

  1. 共享对象/变量:如果线程B需要向线程A传递信息,可以使用共享变量(最好是线程安全的,如 volatile 关键字修饰的变量,或者使用 Atomic 类型,或者通过锁机制如 synchronized 方法/块来保护)。线程B修改共享变量后,线程A能够感知并读取到最新值。

  2. 等待/通知机制:Java提供了 wait()notify()notifyAll() 方法,这些方法需要在同步代码块或同步方法中使用,允许一个线程等待,直到另一个线程通知它条件已改变。

  3. Condition接口java.util.concurrent.locks.Condition 提供了比 wait()/notify() 更灵活的线程间协调机制。它和Lock配合使用,可以实现更复杂的线程间唤醒条件。

  4. CountDownLatch:如果你需要一个线程等待其他线程完成某项操作后再继续执行,可以使用 java.util.concurrent.CountDownLatch。初始化时指定计数器的初始值,线程完成任务后调用 countDown() 减少计数,其他线程通过 await() 等待计数器归零。

  5. CyclicBarrier:与 CountDownLatch 相似,但 java.util.concurrent.CyclicBarrier 可重用,适用于一组线程相互等待,直到到达某个屏障点,然后所有线程一起继续执行。

  6. Semaphore:虽然主要用于控制访问某种资源的线程数量,但也可以用来实现线程间的简单通信,一个线程通过释放信号量,另一个线程通过获取信号量来实现同步。

  7. Future与Callable:如果你想要得到另一个线程执行任务的结果,可以使用 java.util.concurrent.Futurejava.util.concurrent.CallableExecutorService 提交 Callable 任务后返回一个 Future,主线程可以通过 Future.get() 方法等待结果。

每种方法都有其适用场景,选择时应根据具体需求来决定。

8、怎么创建线程池

答:

用ThreadPoolExecutor构造函数

ExecutorService executor = new ThreadPoolExecutor(corePoolSize, // 核心线程数maximumPoolSize, // 最大线程数keepAliveTime, // 空闲线程存活时间TimeUnit.MILLISECONDS, // 时间单位new LinkedBlockingQueue<Runnable>() // 任务队列
);

9、用什么工具,能同时检测java内存泄漏与溢出

答:

  1. JVisualVM: 作为Java自带的性能分析工具,JVisualVM不仅可以实时监控内存使用情况,帮助发现内存泄漏,还可以设置内存使用阈值报警,从而预防内存溢出的发生。当实际内存使用接近设定的阈值时,它会提醒你,有助于及时采取措施防止溢出。

  2. YourKit Java Profiler: YourKit是一个功能全面的商业性能分析工具,它不仅能够实时监控和分析内存使用,识别内存泄漏,还具备强大的内存溢出预防机制。你可以设置内存使用规则,当达到特定条件时触发警告或自动执行堆转储,以便进一步分析。

  3. Java Mission Control (JMC) with Flight Recorder: JMC结合Flight Recorder可以记录详细的运行时数据,包括内存分配和垃圾收集事件,这对于预测和诊断内存溢出非常有用。它能提供详细的内存使用趋势,帮助你在内存溢出之前发现问题。

  4. Eclipse Memory Analyzer Tool (MAT): 虽然MAT主要用于分析已发生的内存泄漏问题,通过分析堆转储文件,但它也能帮助理解是什么原因导致了内存溢出。在内存溢出发生后,通过分析MAT提供的堆快照,你可以找出占用大量内存的对象或引用链,从而修复潜在的内存泄漏并调整内存使用策略以避免未来发生溢出。

  5. Arthas: Arthas作为一个强大的Java诊断工具,虽然主要不是用于监控内存泄漏或溢出,但你可以利用它动态地查询JVM和应用状态,包括内存使用情况,这对于实时监控和故障排查很有帮助。

  6. Prometheus + JMX Exporter: 结合使用监控系统如Prometheus和JMX Exporter,你可以收集Java应用程序的JVM指标,包括内存使用量。设置警报规则可以在内存接近饱和时得到通知,预防潜在的溢出问题。

10、jvm 最大内存设置。设置的原理。结合垃圾回收

答:

JVM内存可以分为堆内存和非堆内存,堆内存给开发人员用的,非堆内存给JVM本身用的,用来存放类型信息,即使GC时也不会释放空间。

堆内存设置:

-Xms 初始堆内存,默认物理内存1/64,也是最小分配堆内存,当空余堆内存小于40%时,会增加到-Xms的最大限制。

-Xmx 最大堆内存分配,默认物理内存1/4,当空余堆内存大于70%时,会减小打-Xms的最小限制。

非堆内存设置:

-XX:PermSize 非堆内存的初始值,默认物理内存的1/64,也是最小非堆内存。

-XX:MaxPermSize 非堆内存最大值,默认物理内存的1/4。

查看堆大小命令为Runtime.getRuntime().maxMemory()。

11、jvm怎样通过参数调整内存大小

答:

idea右上角 edit configurations选中当前启动类,有个mondify options 选 add vm options

12、进程与线程的区别

答:

线程是进程的一个单元,也是进程内的可调度实体。

区别就是:

1、进程内的线程共享地址空间,进程则自己独立的地址空间。

2、进程是资源分配和拥有的单位,同一个进程内的线程共享进程资源。

3、线程是处理器调度的基本单位。

4、两者均可并发执行。

13、如何避免死锁

答:

1. 使用事务时,尽量缩短事务idea逻辑处理过程,及早提交或回滚事务

2. 设置死锁的超时参数为合理范围,如3-10分钟,若超过时间,自动放弃本次操作,避免进程悬挂。

3. 优化程序,检查并避免死锁现象出现。

4. 对所有的脚本和sp都要仔细测试。

5. 所有的sp都要有错误处理。

6. 一般不要修改sql事务的默认级别。不推荐强行加锁。

未完待续...

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词