Skip to content

1、如何在 Windows 和 Linux 上查找哪个线程cpu利用率最高?

windows上面用任务管理器看,linux下可以用 top 这个工具看。

1、 找出cpu耗用厉害的进程pid, 终端执行top命令,然后按下shift+p (shift+m是找出消耗内存最高)查找出cpu利用最厉害的pid号

2、 根据上面第一步拿到的pid号,top -H -p pid 。然后按下shift+p,查找出cpu利用率最厉害的线程号,比如top -H -p 1328

3、 将获取到的线程号转换成16进制,去百度转换一下就行

4、 使用jstack工具将进程信息打印输出,jstack pid号 > /tmp/t.dat,比如jstack 31365 > /tmp/t.dat

5、 编辑/tmp/t.dat文件,查找线程号对应的信息

或者直接使用JDK自带的工具查看“jconsole” 、“visualVm”,这都是JDK自带的,可以直接在JDK的bin目录下找到直接使用

2、堆(Heap-线程共享) -运行时数据区

是被线程共享的一块内存区域, 创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域。由于现代VM 采用分代收集算法, 因此 Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、 From Survivor 区和 To Survivor 区)和老年代。

3、Java中的ReadWriteLock是什么?

读写锁是用来提升并发程序性能的锁分离技术的成果。

4、GC的回收流程是怎样的?

GC回收流程如下:

1、 对于整个的GC流程里面,那么最需要处理的就是新生代和老年代的内存清理操作,而元空间(永久代)都不在GC范围内

2、 当现在有一个新的对象产生,那么对象一定需要内存空间,平均每个栈内存存4k,每个堆内存存8k,那么对象一定需要进行堆空间的申请

3、 首先会判断Eden区是否有内存空间,如果此时有内存空间,则直接将新对象保存在伊甸园区。

4、 但是如果此时在伊甸园区内存不足,那么会自动执行一个Minor GC 操作,将伊甸园区的无用内存空间进行清理,Minor GC的清理范围只在Eden园区,清理之后会继续判断Eden园区的内存空间是否充足?如果内存空间充足,则将新对象直接在Eden园区进行空间分配。

5、 如果执行Minor GC 之后发现伊甸园区的内存空间依然不足,那么这个时候会执行存活区的判断,如果存活区有剩余空间,则将Eden园区部分活跃对象保存在存活区,那么随后继续判断Eden园区的内存空间是否充足,如果充足怎则将新对象直接在Eden园区进行空间分配。

6、 此时如果存活区没有内存空间,则继续判断老年区。则将部分存活对象保存在老年代,而后存活区将有空余空间。

7、 如果这个时候老年代也满了,那么这个时候将产生Major GC(Full GC),那么这个时候将进行老年代的清理

8、 如果老年代执行Full GC之后,无法进行对象的保存,则会产生OOM异常,OutOfMemoryError异常

5、JAVA弱引用

弱引用需要用 WeakReference 类来实现,它比软引用的生存期更短,对于只有弱引用的对象来说,只要垃圾回收机制一运行,不管 JVM 的内存空间是否足够,总会回收该对象占用的内存。

6、生产环境用的什么JDK?如何配置的垃圾收集器?

Oracle JDK 1.8

JDK 1.8 中有 Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1,默认使用 Parallel Scavenge + Parallel Old。

1、 Serial 系列是单线程垃圾收集器,处理效率很高,适合小内存、客户端场景使用,使用参数 -XX:+UseSerialGC 显式启用。

2、 Parallel 系列相当于并发版的 Serial,追求高吞吐量,适用于较大内存并且有多核CPU的环境,默认或显式使用参数 -XX:+UseParallelGC 启用。可以使用 -XX:MaxGCPauseMillis 参数指定最大垃圾收集暂停毫秒数,收集器会尽量达到目标;使用 -XX:GCTimeRatio 指定期望吞吐量大小,默认 99,用户代码运行时间:垃圾收集时间=99:1。

3、 CMS,追求垃圾收集暂停时间尽可能短,适用于服务端较大内存且多 CPU 的应用,使用参数 -XX:+UseConcMarkSweepGC 显式开启,会同时作用年轻代与老年代,但有浮动垃圾和内存碎片化的问题。

4、 G1,主要面向服务端应用的垃圾收集器,适用于具有大内存的多核 CPU 的服务器,追求较小的垃圾收集暂停时间和较高的吞吐量。首创局部内存回收设计思路,采用不同策略实现分代,不再使用固定大小、固定数量的堆内存分代区域划分,而是基于 Region 内存布局,优先回收价收益最大的 Region。使用参数 -XX:+UseG1GC 开启。

我们生产环境使用了 G1 收集器,相关配置如下

1、 -Xmx12g

2、 -Xms12g

3、 -XX:+UseG1GC

4、 -XX:InitiatingHeapOccupancyPercent=45

5、 -XX:MaxGCPauseMillis=200

6、 -XX:MetaspaceSize=256m

7、 -XX:MaxMetaspaceSize=256m

8、 -XX:MaxDirectMemorySize=512m

9、 -XX:G1HeapRegionSize 未指定

核心思路:

1、 每个内存区域设置上限,避免溢出

2、 堆设置为操作系统的 70%左右,超过 8 G,首选 G1

3、 根据老年代对象提升速度,调整新生代与老年代之间的内存比例

4、 等过 GC 信息,针对项目敏感指标优化,比如访问延迟、吞吐量等

7、线上常用的 JVM 参数有哪些?

数据区设置

1、 Xms:初始堆大小

2、 Xmx:最大堆大小

3、 Xss:Java 每个线程的Stack大小

4、 XX:NewSize=n:设置年轻代大小

5、 XX:NewRatio=n:设置年轻代和年老代的比值。如:为 3,表示年轻代与年老代比值为 1:3,年轻代占整个年轻代年老代和的 1/4。

6、 XX:SurvivorRatio=n:年轻代中 Eden 区与两个 Survivor 区的比值。注意 Survivor 区有两个。如:3,表示 Eden:Survivor=3:2,一个 Survivor 区占整个年轻代的 1/5。

7、 XX:MaxPermSize=n:设置持久代大小。

收集器设置

1、 XX:+UseSerialGC:设置串行收集器

2、 XX:+UseParallelGC::设置并行收集器

3、 XX:+UseParalledlOldGC:设置并行年老代收集器

4、 XX:+UseConcMarkSweepGC:设置并发收集器

GC日志打印设置

1、 XX:+PrintGC:打印 GC 的简要信息

2、 XX:+PrintGCDetails:打印 GC 详细信息

3、 XX:+PrintGCTimeStamps:输出 GC 的时间戳

8、一个线程运行时发生异常会怎样?

如果异常没有被捕获该线程将会停止执行。Thread.UncaughtExceptionHandler是用于处理未捕获异常造成线程突然中断情况的一个内嵌接口。当一个未捕获异常将造成线程中断的时候JVM会使用Thread.getUncaughtExceptionHandler()来查询线程的UncaughtExceptionHandler并将线程和异常作为参数传递给handler的uncaughtException()方法进行处理。

9、为什么wait, notify 和 notifyAll这些方法不在thread类里面?

一个很明显的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象。

10、在老年代-标记整理算法

因为对象存活率高、没有额外空间对它进行分配担保, 就必须采用“标记—清理”或“标记—整理” 算法来进行回收, 不必进行内存复制, 且直接腾出空闲内存。

11、线程类的构造方法、静态块是被哪个线程调用的

12、栈

13、强引用、软引用、弱引用、虚引用是什么,有什么区别?

14、为什么要使用并发编程

15、重排序遵守的规则

16、64 位 JVM 中,int 的长度是多数?

17、谈谈动态年龄判断

18、遇到过元空间溢出吗?

19、如何写一段简单的死锁代码?

20、并发关键字 synchronized ?

21、JVM 的内存模型是什么?

22、Java 堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)

23、你知道哪些垃圾收集器?

24、synchronized的作用?

25、Lock 接口和synchronized 对比同步它有什么优势?

26、当一个线程进入某个对象的一个synchronized的实例方法后,其它线程是否可进入此对象的其它方法?

27、什么是方法区

28、什么是自旋

29、Java 中堆和栈有什么区别?

30、你说你做过JVM参数调优和参数配置,请问如何查看JVM系统默认值

31、你知道哪些内存分配与回收策略?

用心去做高质量的内容网站,欢迎 star ⭐ 让更多人发现