JVM | 可达性分析 | 在Java中,可作为GC Root的对象包括以下几种: ● 虚拟机栈(栈帧中的本地变量表)中引用的对象 ● 方法区中类静态属性引用的对象 ● 方法区中常量引用的对象 ● 本地方法栈中JNI(即一般说的Native方法)引用的对象 | |
内存模型,程序计数器的作用 | 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区。 程序计数器的作用: 1、字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。 2、在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。 | ||
MetaSpace介绍 | 在永久代移除后,字符串常量池也不再放在永久代了,但是也没有放到新的方法区---元空间里,而是留在了堆里(为了方便回收)。运行时常量池随着搬家到了元空间里,毕竟它是装类的重要等信息的,有它的地方才称得上是方法区。 | ||
类加载机制和过程 | 加载 链 接(验证准备解析) 初始化 某个特定的类加载器接收到类加载的请求时,会将加载任务委托给自己的父类,直到最高级父类引导类加载器(bootstrap class loader),如果父类能够加载就加载,不能加载则返回到子类进行加载。如果都不能加载则报错。ClassNotFoundException | ||
怎么判断一个类应该被哪个类加载器加载 | TODO | ||
垃圾回收 | 回收死亡对象的内存共有三种方式,分别为:会造成内存碎片的清除、性能开销较大的压缩、以及堆使用效率较低的复制。 | ||
垃圾收集器 | G1的内存模型 G1垃圾收集器没有新生代和老年代的概念了,而是将堆划分为一块块独立的Region。当要进行垃圾收集时,首先估计每个Region中的垃圾数量,每次都从垃圾回收价值最大的Region开始回收,因此可以获得最大的回收效率。 ParNew收集器追求降低用户线程的停顿时间,因此适合交互式应用;而Parallel Scavenge追求CPU吞吐量,能够在较短的时间内完成指定任务,因此适合没有交互的后台计算。 Serial收集器适合所需内存较小的客户端应用。 Serial Old收集器是Serial的老年代版本,它们都是单线程收集器,也就是垃圾收集时只启动一条GC线程,因此都适合客户端应用。 Parallel Old收集器是Parallel Scavenge的老年代版本,一般它们搭配使用,追求CPU吞吐量。 CMS收集器是一款追求停顿时间的老年代收集器,它在垃圾收集时使得用户线程和GC线程并行执行,因此在垃圾收集过程中用户也不会感受到明显的卡顿。但用户线程和GC线程之间不停地切换会有额外的开销,因此垃圾回收总时间就会被延长。 | ||
对象在堆里存储的结构 | 对象头、实际数据、对齐填充 |
性能调优 | 服务器响应变慢排查步骤 | ||
CPU飙升排查步骤 | cpu占用过高排查思路 2. top 查看占用cpu的进程 pid 4. top -Hp pid 查看进程中占用cpu过高的线程id tid 6. printf '%x/n' tid 转化为十六进制 8. jstack pid |grep tid的十六进制 -A 30 查看堆栈信息定位 jvm old区占用过高排查思路 2. top查看占用cpu高的进程 4. jstat -gcutil pid 时间间隔 查看gc状况 6. jmap -dump:format=b,file=name.dump pid 导出dump文件 8. 用visualVM分析dump文件 | ||
垃圾回收调优 | 垃圾收集器的种类很多,我们可以将其分成两种类型,一种是响应速度快,一种是吞吐量高。通常情况下,CMS 和 G1 回收器的响应速度快,Parallel Scavenge 回收器的吞吐量高。 |