JVM

nangongyanya 2020-08-09

JVM内存模型

  • 堆:对象。
  • 栈:局部变量,操作数栈,动态连接,方法的返回地址。
  • 方法区:常量,静态变量,类信息。
  • 本地方法栈:Native方法。
  • 程序计数器:字节码的访问地址。

类加载过程

  • 过程:1、加载:生成class对象;2、验证;3、准备:static变量分配内存和初始值;4、解析:符号引用替换为直接引用;5、初始化:父类没初始化需先初始化。(家宴准解出

双亲委派机制

  • 父类加载,不重复加载。
  • 自定义--应用程序--扩展--启动。

分代回收

  • 新生代(Eden/s1/s2),老年代,永久代/元空间。
  • 晋升机制根据对象存活时间。

垃圾回收器

  • CMS(标记清除):初始化标记,并发标记,重新标记,标记清除,标记重置。

  • G1(复制+标记清除):新生代和老年代不再隔离。

full gc的时机

  • 老年代/永久代空间不足。
  • System.gc()方法。
  • 晋升老年代的大小大于老年代的剩余空间。

性能调优

  • 目的:减少gc,stw。
  • 方法:设置堆的最大最小值,调整新生代与老年代的比例,配置高可以设置并发收集算法。

oom种类

  • 对象太多没有释放。
  • 线程创建太多没有释放。
  • fd太多,一个进程1024个fd。

逃逸分析

  • 依据:对象被赋值给堆中对象的字段或类的静态变量(其他线程访问时编译器无法追踪);位于不确定的代码中(保守处理)。

JVM调优的情况

  • 线程死锁
  • 锁竞争
  • CPU过高
  • 内存泄露

JVM指令与工具

  • jps:查看java进程概述
  • jstat -gcutil [pid] [时间间隔]:根据进程id查看进程的详细情况
  • jstack [pid]:查看进程中的线程运行状况
  • jmap -dump:file=[文件名] pid:将进程运行的状况dump到文件中,文件通过fastThread线上工具分析。
  • jmap -heap [pid]:打印进程的堆内存信息
  • jconsolevisual VM工具

相关推荐