Java名企面试题3

一 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

 

四 方法区里什么样的对象有可能被回收。

  1. 废弃的常量主要包括两大类 字面量和符号引用

字面量比较接近Java语言中的常量概念。回收废弃的常量和回收Java堆中的对象类似,如:要回收字符串“s”,当系统中没有任何String类型的对象引用常量池中的"s"时,也没有其他地方引用这个字面量,如果发生内存回收,而且有必要的话,则会将该字符串清理出常量池中。其中包括文本字符串、被声明为final的常量值等
而符号引用属于编译方面的概念。常量池中的其他类、接口、方法、字段的符号引用也与此类似,包括

  1. 类和接口的全限定名
  2. 字段的名称和描述符
  3. 方法的名称和描述符

2.无用的类: 要判断一个无用的类的条件非常的苛刻,需要满足:

  1. 该类的所有实例都被回收,即:Java堆中不存在该类的任何实例
  2. 该类的Classloader已经被回收
  3. 该类对用的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问到该类的方法。
    当满足以上三个条件时,也未必说是一定要被回收。也仅仅是可以。


五 线上cpu飙升100%你怎么处理。

什么样的场景会导致线上CPU负载过高?

代码层面常见的场景有:

  1. 程序陷入死循环,不停地消耗CPU
  2. 线程死锁,线程相互等待,导致假死状态,不停地消耗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应用程序的线程堆栈。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值