Java面试(1)之 JVM篇

内存模型及原理

1, JVM内存模型

 

5b294dee5d894abea6eba6d0fc1f8148.png

2, 类加载器及双亲委派模型

f35d702e4e42494e959dded524c2a675.png

2.1 类加载器的作用?

将Java文件解析成Class文件对象,即 通过一个类的全限定名来得到其二进制字节流.(不同类加载器加载的对象一定不同)

2.2 什么是双亲委派模型?

如果一个类接收到类加载的请求不会自己去加载,而是向上委托给父加载器直到顶层加载器进行加载,顶层加载器加载不了则再由子加载器加载,目的是为了防止对象重复,保证对象全局唯一.

2.3 什么情况下会破坏双亲委派模型及哪些场景存在双亲委派?

加载类的时候,不是从APPClassLoader->Ext ClassLoader->BootStrap ClassLoader 这个顺序找,那就算是打破了

tomcat: tomcat的webapp目录下支持存在多个不同应用的部署,每个应用允许存在相同包路径的类对象,tomcat底层是自定义实现了AppClassLoader来做了应用层级的隔离

28ebb7f50e014561a9b0ac30e1d32817.png

 

---------------------------------------------------------------------------------------------------------------

常见的垃圾收集器比较

垃圾收集器一般都是针对堆上对象的回收,堆分为新生代、老年代;新生代又分为Eden、Survivor0、Survivor1.

堆分布

收集器

算法

特点

JDK版本

适用场景

新生代

Serial

复制

单线程

发生垃圾回收时程序阻塞直到回收结束

1.3之前

单CPU环境下的Client模式

ParNew

复制

Serial的多线程版本,可与CMS结合使用

1.3之后

多CPU环境时在Server模式下与CMS配合

Parallel-scanvenge

复制

多线程

大部分与ParNew类似,区别在于可以动态调整Eden与Surivor的比例

追求高吞吐量,比较适合不与前端交互类纯后端的应用(定时任务、批处理等)

不能与CMS结合,与Paralle-Old

1.5左右

在后台运算而不需要太多交互的任务

G1

复制

多个大小固定的Region(1~32M)

默认2048个分区

超大对象放在Humongous区

1.8(9开始默认收集器用G1)

面向服务端应用,将来替换CMS

老年代

Serial-Old

标记整理

单线程

发生垃圾回收时程序阻塞直到回收结束

1.3之前

单CPU环境下的Client模式、CMS的后备预案

Parallel-Old

标记整理

Parallel-scanvenge的老年代版本

1.6

在后台运算而不需要太多交互的任务

CMS

标记清除

容易产生内存碎片

大对象出现时会导致FullGC

1.5

集中在互联网站或B/S系统服务端上的Java应用

G1

标记整理

可以设置预期回收的时间(默认200ms)

不会发生Full GC,而是mixed 混合GC模式,即新生代、老年代一起回收

1.8(9开始默认收集器用G1)

面向服务端应用,将来替换CMS

查看当前使用的垃圾回收器:

-XX:+PrintCommandLineFlags可以打印所有的参数,包括使用的垃圾回收器。

CMS/G1等回收器回收过程:

初始标记: 只是标记一下 GC Roots 能直接关联的对象,速度很快,仍然需要暂停所有的工作线程。

并发标记: 进行 GC Roots 跟踪的过程,和用户线程一起工作,不需要暂停工作线程。

重新标记: 为了修正在并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,仍然需要暂停所有的工作线程。

并发清除: 清除 GC Roots 不可达对象,和用户线程一起工作,不需要暂停工作线程。由于耗时最长的并发标记和并发清除过程中,垃圾收集线程可以和用户现在一起并发工作, 所以总体上来看CMS 收集器的内存回收和用户线程是一起并发地执行。

参照: Java——七种垃圾收集器+JDK11最新ZGC_java垃圾回收器最新-CSDN博客

-----------------------------------------------------------------------------------------------------------

性能调优

1, 调优工具

JDK的bin目录下jconsole 和 jvisualvm等工具

2, 调优参数

  • -Xmx: 最大堆大小
  • -Xms: 最小堆大小
  • -Xmn: 新生代大小
  • -XX:SurvivorRator=8 : 新生代Eden与s0、s1的比为8:1:1
  • -XX:PretenureSizeThreshold=3145728: 表示当创建(new)的对象大于3M的时候直接进入老年代
  • -XX:MaxTenuringThreshold=15: 表示当对象的存活的年龄(minor gc一次加1)大于多少时,进入老年代
  • -XX:-DisableExplicirGC: 表示是否(+表示是,-表示否)打开GC日志

3, JVM调优命令

jps(JVM Process Status Tool): 显示指定系统内所有的HotSpot虚拟机进程

jstat(JVM statistics Monitoring): 用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类 装载、内存、垃圾收集、JIT编译等运行数据

jmap(JVM Memory Map): 用于生成heap dump文件

jhat(JVM Heap Analysis Tool): 是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看 jstack,用于生成java虚拟机当前时刻的线程快照

jinfo(JVM Configuration info): 实时查看和调整虚拟机运行参数

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远方的、远方的、、、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值