一 like能用索引吗?
根据最左匹配原则,%x x不能使用索引,x x%可以使用索引。
二 java对象四种引用。
1.强引用
强引用有引用变量指向时永远不会被垃圾回收,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。
2.软引用(SoftReference)
如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;
如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。
软引用可用来实现内存敏感的高速缓存,比如网页缓存、图片缓存等。使用软引用能防止内存泄露,增强程序的健壮性。
3.弱引用(WeakReference)
弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。
4.虚引用(PhantomReference)
虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。
要注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
可以用来跟踪查看对象的回收情况。
三 Mysql SQL优化
https://blog.csdn.net/long690276759/article/details/79571421
四 方法区里什么样的对象有可能被回收。
- 废弃的常量主要包括两大类 字面量和符号引用
字面量比较接近Java语言中的常量概念。回收废弃的常量和回收Java堆中的对象类似,如:要回收字符串“s”,当系统中没有任何String类型的对象引用常量池中的"s"时,也没有其他地方引用这个字面量,如果发生内存回收,而且有必要的话,则会将该字符串清理出常量池中。其中包括文本字符串、被声明为final的常量值等
而符号引用属于编译方面的概念。常量池中的其他类、接口、方法、字段的符号引用也与此类似,包括
- 类和接口的全限定名
- 字段的名称和描述符
- 方法的名称和描述符
2.无用的类: 要判断一个无用的类的条件非常的苛刻,需要满足:
- 该类的所有实例都被回收,即:Java堆中不存在该类的任何实例
- 该类的Classloader已经被回收
- 该类对用的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问到该类的方法。
当满足以上三个条件时,也未必说是一定要被回收。也仅仅是可以。
五 线上cpu飙升100%你怎么处理。
什么样的场景会导致线上CPU负载过高?
代码层面常见的场景有:
- 程序陷入死循环,不停地消耗CPU
- 线程死锁,线程相互等待,导致假死状态,不停地消耗CPU
步骤一、找到最耗CPU的进程
工具:top
方法:
-
执行top -c ,显示进程运行信息列表
-
键入P (大写p),进程按照CPU使用率排序
步骤二:找到最耗CPU的线程
工具:top
方法:
-
top -Hp 10765 ,显示一个进程的线程运行信息列表
-
键入P (大写p),线程按照CPU使用率排序
步骤三:将线程PID转化为16进制
工具:printf
方法:printf “%x\n” 10804
步骤四:查看堆栈,找到线程在干嘛
工具:pstack/jstack/grep
方法:jstack 10765 | grep ‘0x2a34’ -C5 --color
-
打印进程堆栈
-
通过线程id,过滤得到线程堆栈
六 频繁FullGC怎么处理
查看GC日志,分析每次FullGC后内存变化情况,确定导致GC对象,然后根据代码进行优化。
七 线程池创建有几种,为什么创建定长的线程池个数最好是5,10,15这样的数字。
Java通过Executors提供四种线程池,分别为:
new CachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
new FixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
new ScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
new SingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
八 redis和memcached区别。
https://www.cnblogs.com/457248499-qq-com/p/7392653.html
九 说几个jdk命令,jmap是什么意思。
jps Java进程查看命令。
jstat 查看虚拟机运行时信息,如 ClassLoader相关信息、GC相关堆信息、老年代和永久代信息等。
jinfo 查看虚拟机参数,且支持在运行时修改部分参数。
jmap 导出堆信息到文件,可以生成java程序的Dump文件,也可以查看堆内对象的示例统计信息、查看ClassLoader的信息及finalizer队列。
jstak 导出java应用程序的线程堆栈。