Review-JVM

总体介绍

JVM内存结构

JVM体系概述

在这里插入图片描述

Java8以后的JVM

在这里插入图片描述
在这里插入图片描述

GC作用域

在这里插入图片描述

常见的垃圾回收算法

引用计数

在这里插入图片描述

复制算法

在这里插入图片描述

标记清除

在这里插入图片描述

标记整理

在这里插入图片描述

JM垃圾回收的时候如何确定垃圾?什么是 GC Roots

什么是垃圾

简单的说就是内存中已经不再被使用到的空间就是垃圾

要进行垃圾回收,如何判断一个对象是否可以被回收

引用计数法

Java中,引用和对象是有关联的。如果要操作对象则必须用引用进行
因此,很显然一个简单的办法是通过引用计数来判断一个对象是否可以回收。简单说,给对象中添加一个引用计数器,
每当有一个地方引用它,计数器值加1
每当有一个引用失效时,计数器值减1。
任何时刻计数器值为零的对象就是不可能再被使用的,那么这个对象就是可回收对象
那为什么主流的Java虚拟机里面都没有选用这种算法呢?其中最主要的原因是它很难解决对象之间相互循环引用的问题

枚举根节点做可达性分析(根搜索路径)
在这里插入图片描述
demo
在这里插入图片描述
java 可以做GCRoots的对象

  • 虚拟机栈(栈帧中的局部变量区,也叫做局部变量表
  • 方法区中的类静态属性引用的对象。
  • 方法区中常量引用的对象
  • 本地方法栈中N( Native方法)引用的对象

JVM调优和参数配置,如何盘点查看MM系统默认值

JVM的参数类型

标配参数

在这里插入图片描述

X参数(了解)

在这里插入图片描述
-Xint 解释执行

-Xcomp 第一次使用就编译成本地代码

-Xmixed 混合模式

XX参数

Boolean类型

公式

-XX:+或者- 某个属性值

+表示开启 -表示关闭

是否打印GC收集细节

-XX:+PrintGCDetails

-XX:-PrintGCDetails

是否使用串行垃圾收集器

-XX:-UseSerialGC

-XX:+UseSerialGC

KV设值类型

公式

-XX:属性key=属性值value

-XX:MetaspaceSize=128m

-XX:MaxTenuringThreshold=15

jinfo举例,如何查看当前运行程序的配置

公式

jinfo -flag 配置项 进程编号

题外话(坑题)

两个经典参数:-Xms和-Xmx

-Xms <===>等价于 -XX:InitialHeapSize

-Xmx <====>等价于-XX:MaxHeapSize

查看JVM默认值

-XX:+PrintFlagsInitial

查看初始默认值

公式

java -XX:+PrintFlagsInitial -version
在这里插入图片描述
java -XX:+PrintFlagsInitial

常用的JVM基本配置参数有哪些

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

常用参数

-Xms

初始大小内存,默认为物理内存1/64

等价于-XX:InitialHeapSize

-Xmx

最大分配内存,默认为物理内存1/4

等价于-XX:MaxHeapSize

-Xss

设置单个线程的大小,一般默认为512K~1024K

等价于-XX:ThreadStackSize

-Xmn

设置年轻代大小

-XX:MetaspaceSize

设置元空间大小

元空间的本质和永久代类似,都是对JVM规范中方法区的实现,不过元空间与永久代之间最大的区别在于;元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,源空间的大小仅受本地内存限制。

-Xms10m -Xmx10m -XX:MetaspaceSize=1024m -XX:+PrintFlagsFinal

设置案例

在这里插入图片描述

-XX:+PrintGCDetails

输出详细GC收集日志信息

GC
在这里插入图片描述
FullGC
在这里插入图片描述

-XX:SurvivoRatio

在这里插入图片描述
在这里插入图片描述

-XX:NewRatio

在这里插入图片描述

-XX:MaxTenuringThreshold

设置垃圾最大年龄
在这里插入图片描述

强引用、软引用、弱引用、虚引用分别

整体架构

在这里插入图片描述

强引用(默认支持模式)

在这里插入图片描述
在这里插入图片描述

软引用

在这里插入图片描述
在这里插入图片描述

弱引用

在这里插入图片描述
在这里插入图片描述

软引用和弱应用的适用场景

在这里插入图片描述

虚引用

在这里插入图片描述

GCRoots和四大引用的小总结

在这里插入图片描述

对OOM的认识

Java.lang.StackOverflowError

递归调用 栈的大小默认为512K~1024K

在这里插入图片描述

Java.lang.OutOfMemoryError:Java heap space

在这里插入图片描述

Java.lang.OutOfMemeoryError:GC overhead limit exceeded

程序在垃圾回收上花费了98%的时间,却收集不回2%的空间,通常这样的异常伴随着CPU的冲高
在这里插入图片描述

Java.lang.OutOfMemeoryError:Direct buffer memory

在这里插入图片描述
在这里插入图片描述

Java.lang.OutOfMemeoryError:unable to create new native thread

在这里插入图片描述
在这里插入图片描述

Java.lang.OutOfMemeoryError:Metaspace

在这里插入图片描述
-XX:+PrintFlagsInitial命令查看本机的初始化参数,-XX:MetaspaceSize为21810376B(约20M)
在这里插入图片描述

GC垃圾回收算法和垃圾收集器的关系

GC算法(引用计数/复制/标清/标整)是内存回收的方法论,垃圾收集器就是算法落地实现

因为目前为止还没有完美的收集器出现,更加没有万能的收集器,只是针对具体应用最合适的收集器,进行分代收集

4种主要垃圾收集器
在这里插入图片描述
串行垃圾回收器(Serial)

它为单线程环境设计并且只使用一个线程进行垃圾回收,会暂停所有的用户线程。所以不适合服务器环境

并行垃圾回收器(Parallel)

多个垃圾回收线程并行工作,此时用户线程是暂停的,适用于科学计算/大数据处理等弱交互场景

并发垃圾回收器(CMS)

用户线程和垃圾收集线程同时执行(不一定是并行,可能交替执行),不需要停顿用户线程
互联网公司多用它,适用于对响应时间有要求的场景

G1垃圾回收器

G1垃圾回收器将堆内存分割成不同的区域然后并发的对其进行垃圾回收

怎么查看服务器默认的垃圾收集器是那个?生产上如何配置垃圾收集器的?

怎么查看默认的垃圾收集器是哪个?

java -XX:+PrintCommandLineFlags -version
在这里插入图片描述

默认的垃圾收集器有哪些

在这里插入图片描述

垃圾收集器

在这里插入图片描述
在这里插入图片描述

部分参数预先说明

在这里插入图片描述

Server/Client模式分别是什么意思

在这里插入图片描述

新生代

串行GC(Serial)/(Serial Coping)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
并行GC(ParNew)
在这里插入图片描述
在这里插入图片描述
并行回收GC(Parallel)/(Parallel Scavenge)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

老年代

串行回收GC(Serial Old)/(Serial MSC)
在这里插入图片描述
并行GC(Parallel Old)/(Parallel MSC)
在这里插入图片描述
并发标记清除GC(CMS)
在这里插入图片描述
在这里插入图片描述

4个过程

  • 初始标记(CMS initial mark)

  • 并发标记(CMS concurrent mark)和用户线程一起

  • 在这里插入图片描述

  • 重新标记(CMS remark)

  • 在这里插入图片描述

  • 并发清除(CMS concurrent sweep)和用户线程一起

  • 在这里插入图片描述
    总体过程
    在这里插入图片描述
    优缺点

优点:

并发收集低停顿

缺点:

  • 并发执行,对CPU资源压力大

在这里插入图片描述

  • 采用的标记清除算法会导致大量碎片
    在这里插入图片描述

垃圾收集器配置代码总结

底层代码

在这里插入图片描述

G1垃圾收集器

以前收集器特点

  • 年轻代和老年代是各自独立且连续的内存块
  • 年轻代收集使用单eden+S0 +S进行复制算法
  • 老年代收集必须扫描整个老年代区域
  • 都是以尽可能少而快速地执行GC为设计原则

G1是什么

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

底层原理

Region区域化垃圾收集器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最大好处是化整为零,避免全内存扫描,只需要按照区域来进行扫描即可

回收步骤

在这里插入图片描述
在这里插入图片描述

4步过程

在这里插入图片描述

常用配置参数(了解)

在这里插入图片描述

和CMS相比的优势

在这里插入图片描述

总结

在这里插入图片描述

生产环境服务器变慢,诊断思路和性能评估

整机:top

uptime,系统性能命令的精简版

CPU:vmstat

查看CPU(包含不限于)
在这里插入图片描述
在这里插入图片描述
查看额外

  • 查看所有CPU核信息

    mpstat -P ALL 2

  • 每个进程使用cpu的用量分解信息

​ pidstat -u 1 -p 进程编号

内存:free

应用程序可用内存数

在这里插入图片描述
在这里插入图片描述

查看额外

pidstat -p 进程号 -r 采样间隔秒数

硬盘:df

查看磁盘剩余空闲数
在这里插入图片描述

磁盘IO:iostat

磁盘I/O性能评估

在这里插入图片描述
在这里插入图片描述

查看额外

pidstat -d 采样间隔秒数 -p 进程号

网络IO:ifstat

默认本地没有,下载ifstat

在这里插入图片描述

查看网络IO

在这里插入图片描述
在这里插入图片描述

假如生产环境出现CPU占用过高,如何分析思路和定位

结合Linux和JDK命令一块分析

案例步骤

  1. 先用top命令找出CPU占比最高的
    在这里插入图片描述
  2. ps -ef或者jps进一步定位,得知是一个怎么样的一个后台程序

ps -ef|grep java|grep -v grep

  1. 定位到具体线程或者代码

ps -mp 进程 -o THREAD,tid,time

-m 显示所有线程

-p pid进程使用cpu的时间

-o 该参数后是用户自定义格式

在这里插入图片描述4. 将需要的线程ID转换为16进制格式(英文小写格式)
windows系统计算器可以自动进行进制转化

printf "%x\n" 有问题的线程ID

  1. jstack 进程ID | grep tid(16进制线程ID小写英文) -A60

A60 前60行

对于JDK自带的JVM监控和性能分析工具用过哪些?一是怎么用的?

在这里插入图片描述

性能监控工具

  • jps(虚拟机进程状况工具)
  • jinfo(Java配置信息工具)
  • jmap(内存映像工具)
  • jstat(统计信息监控工具)
    在这里插入图片描述
posted @ 2020-06-17 11:11  盲目的拾荒者  阅读(319)  评论(0编辑  收藏  举报