内存模型及原理
1, JVM内存模型
2, 类加载器及双亲委派模型
2.1 类加载器的作用?
将Java文件解析成Class文件对象,即 通过一个类的全限定名来得到其二进制字节流.(不同类加载器加载的对象一定不同)
2.2 什么是双亲委派模型?
如果一个类接收到类加载的请求不会自己去加载,而是向上委托给父加载器直到顶层加载器进行加载,顶层加载器加载不了则再由子加载器加载,目的是为了防止对象重复,保证对象全局唯一.
2.3 什么情况下会破坏双亲委派模型及哪些场景存在双亲委派?
加载类的时候,不是从APPClassLoader->Ext ClassLoader->BootStrap ClassLoader 这个顺序找,那就算是打破了
tomcat: tomcat的webapp目录下支持存在多个不同应用的部署,每个应用允许存在相同包路径的类对象,tomcat底层是自定义实现了AppClassLoader来做了应用层级的隔离
---------------------------------------------------------------------------------------------------------------
常见的垃圾收集器比较
垃圾收集器一般都是针对堆上对象的回收,堆分为新生代、老年代;新生代又分为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): 实时查看和调整虚拟机运行参数