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线程
答:
-
共享对象/变量:如果线程B需要向线程A传递信息,可以使用共享变量(最好是线程安全的,如
volatile
关键字修饰的变量,或者使用Atomic
类型,或者通过锁机制如synchronized
方法/块来保护)。线程B修改共享变量后,线程A能够感知并读取到最新值。 -
等待/通知机制:Java提供了
wait()
、notify()
和notifyAll()
方法,这些方法需要在同步代码块或同步方法中使用,允许一个线程等待,直到另一个线程通知它条件已改变。 -
Condition接口:
java.util.concurrent.locks.Condition
提供了比wait()
/notify()
更灵活的线程间协调机制。它和Lock配合使用,可以实现更复杂的线程间唤醒条件。 -
CountDownLatch:如果你需要一个线程等待其他线程完成某项操作后再继续执行,可以使用
java.util.concurrent.CountDownLatch
。初始化时指定计数器的初始值,线程完成任务后调用countDown()
减少计数,其他线程通过await()
等待计数器归零。 -
CyclicBarrier:与
CountDownLatch
相似,但java.util.concurrent.CyclicBarrier
可重用,适用于一组线程相互等待,直到到达某个屏障点,然后所有线程一起继续执行。 -
Semaphore:虽然主要用于控制访问某种资源的线程数量,但也可以用来实现线程间的简单通信,一个线程通过释放信号量,另一个线程通过获取信号量来实现同步。
-
Future与Callable:如果你想要得到另一个线程执行任务的结果,可以使用
java.util.concurrent.Future
和java.util.concurrent.Callable
。ExecutorService
提交Callable
任务后返回一个Future
,主线程可以通过Future.get()
方法等待结果。
每种方法都有其适用场景,选择时应根据具体需求来决定。
8、怎么创建线程池
答:
用ThreadPoolExecutor构造函数
ExecutorService executor = new ThreadPoolExecutor(
corePoolSize, // 核心线程数
maximumPoolSize, // 最大线程数
keepAliveTime, // 空闲线程存活时间
TimeUnit.MILLISECONDS, // 时间单位
new LinkedBlockingQueue<Runnable>() // 任务队列
);
9、用什么工具,能同时检测java内存泄漏与溢出
答:
-
JVisualVM: 作为Java自带的性能分析工具,JVisualVM不仅可以实时监控内存使用情况,帮助发现内存泄漏,还可以设置内存使用阈值报警,从而预防内存溢出的发生。当实际内存使用接近设定的阈值时,它会提醒你,有助于及时采取措施防止溢出。
-
YourKit Java Profiler: YourKit是一个功能全面的商业性能分析工具,它不仅能够实时监控和分析内存使用,识别内存泄漏,还具备强大的内存溢出预防机制。你可以设置内存使用规则,当达到特定条件时触发警告或自动执行堆转储,以便进一步分析。
-
Java Mission Control (JMC) with Flight Recorder: JMC结合Flight Recorder可以记录详细的运行时数据,包括内存分配和垃圾收集事件,这对于预测和诊断内存溢出非常有用。它能提供详细的内存使用趋势,帮助你在内存溢出之前发现问题。
-
Eclipse Memory Analyzer Tool (MAT): 虽然MAT主要用于分析已发生的内存泄漏问题,通过分析堆转储文件,但它也能帮助理解是什么原因导致了内存溢出。在内存溢出发生后,通过分析MAT提供的堆快照,你可以找出占用大量内存的对象或引用链,从而修复潜在的内存泄漏并调整内存使用策略以避免未来发生溢出。
-
Arthas: Arthas作为一个强大的Java诊断工具,虽然主要不是用于监控内存泄漏或溢出,但你可以利用它动态地查询JVM和应用状态,包括内存使用情况,这对于实时监控和故障排查很有帮助。
-
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事务的默认级别。不推荐强行加锁。
未完待续...