美文网首页
44 jvm 调优之线上生产环境手写智能报警系统

44 jvm 调优之线上生产环境手写智能报警系统

作者: 滔滔逐浪 | 来源:发表于2020-08-16 07:28 被阅读0次

    1,hOSTSpot虚拟机对象存在布局原理:
    new 出对象占多少字节:和操作系统有关系32/64位,
    分为: 对象头,实例数据, 对其填充
    对其填充: 对象字节/8倍数, 如果不足的情况下填充。
    实例数据: 成员属性
    对象头: 固定大小 在64位虚拟机 的情况下markword 占用64位,32位虚拟机占32位,64位等于8个字节。

    image.png

    HotSpot 虚拟机的对象头(Object Header)包括2部分信息:
    第一部分"MarkWord": 用于存储对象自身的运行时数据,如哈希码(HashCode),GC分代年龄,锁状态标志,线程持有锁,偏向锁ID,偏向时间戳等。
    第二部分:" Klass Pointer": 对象指向他的类的元数据的指针。虚拟机通过这个指针来确定这个对象时那个类的实例。(数组,对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通java对象的元数据 信息确定java对象的大小,但是从数组的元数据中无法确定数组的大小。)

    image.png

    注意:在64位的虚拟机情况下 mark word 占用64位 ,32位虚拟机占32位。
    64位等于多少 /8 8个字节

    image.png

    虚拟机源码中查看Mark Word

    image.png

    查看head占多少字节
    pom.xml

      <dependency>
                <groupId>org.openjdk.jol</groupId>
                <artifactId>jol-core</artifactId>
                <version>0.9</version>
            </dependency>
    
    
    package com.taotao.jvm1.day06;
    
    
    import org.openjdk.jol.info.ClassLayout;
    
    /**
     *@author tom
     *Date  2020/8/16 0016 6:48
     *
     */
    public class Test001 {
        public static void main(String[] args) {
               UserEntity userEntity=new UserEntity();
            System.out.println(ClassLayout.parseInstance(userEntity).toPrintable());
    
        }
    }
    
    
    image.png

    Klass Pointer

    这一部分用于存储对象的类型指针,该指针指向它的类元数据,jvm通过这个指针确定对象是哪个类的实例。该指针的位长度为JVM的一个字大小,即32位的JVM为32位,64位的JVM为64位。
    如果应用的对象过多,使用64位的指针将浪费大量内存,统计而言,64的JVM将会比32位的JVM多耗费50的内存。为了节约内存可以使用选项 -XX:+UseCompressedOops 开启指针压缩。其中 oop即ordinary object pointer 普通对象指针。

    -XX:+UseCompressedOops 开启指针压缩
    -XX:-UseCompressedOops 不开启指针压缩
    对象头:Mark Word+Klass Pointer类型指针 未开启压缩的情况下
    32位 Mark Word =4bytes ,类型指针 4bytes ,对象头=8bytes =64bits
    64位 Mark Word =8bytes ,类型指针 8bytes ,对象头=16bytes=128bits;
    注意:默认情况下,开启了指针压缩 可能只有12字节。

    
    "C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" -XX:-UseCompressedOops "-javaagent:D:\program\idea\IntelliJ IDEA 2020.1\lib\idea_rt.jar=62939:D:\program\idea\IntelliJ IDEA 2020.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;F:\works\2020\mayiketang\7\jvm\jvm1\target\classes;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.3.2.RELEASE\spring-boot-starter-web-2.3.2.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter\2.3.2.RELEASE\spring-boot-starter-2.3.2.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot\2.3.2.RELEASE\spring-boot-2.3.2.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.3.2.RELEASE\spring-boot-autoconfigure-2.3.2.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.3.2.RELEASE\spring-boot-starter-logging-2.3.2.RELEASE.jar;C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;C:\Users\Administrator\.m2\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;C:\Users\Administrator\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\Administrator\.m2\repository\org\yaml\snakeyaml\1.26\snakeyaml-1.26.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.3.2.RELEASE\spring-boot-starter-json-2.3.2.RELEASE.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.11.1\jackson-databind-2.11.1.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.11.1\jackson-annotations-2.11.1.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.11.1\jackson-core-2.11.1.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.11.1\jackson-datatype-jdk8-2.11.1.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.11.1\jackson-datatype-jsr310-2.11.1.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.11.1\jackson-module-parameter-names-2.11.1.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.3.2.RELEASE\spring-boot-starter-tomcat-2.3.2.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.37\tomcat-embed-core-9.0.37.jar;C:\Users\Administrator\.m2\repository\org\glassfish\jakarta.el\3.0.3\jakarta.el-3.0.3.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.37\tomcat-embed-websocket-9.0.37.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-web\5.2.8.RELEASE\spring-web-5.2.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-beans\5.2.8.RELEASE\spring-beans-5.2.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-webmvc\5.2.8.RELEASE\spring-webmvc-5.2.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-aop\5.2.8.RELEASE\spring-aop-5.2.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-context\5.2.8.RELEASE\spring-context-5.2.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-expression\5.2.8.RELEASE\spring-expression-5.2.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-core\5.2.8.RELEASE\spring-core-5.2.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-jcl\5.2.8.RELEASE\spring-jcl-5.2.8.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\openjdk\jol\jol-core\0.9\jol-core-0.9.jar" com.taotao.jvm1.day06.Test001
    com.taotao.jvm1.day06.UserEntity object internals:
     OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
          0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
          4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
          8     4        (object header)                           a0 35 74 1b (10100000 00110101 01110100 00011011) (460600736)
         12     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
         16     4    int UserEntity.I                              0
         20     4        (loss due to the next object alignment)
    Instance size: 24 bytes
    Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
    
    
    Process finished with exit code 0
    
    

    new 出一个对象到底占用多少字节?
    如果是32位操作系统,对象头占用8个字节
    如果是64位操作系统 对象头占用16个字节。如果对象头没压缩的情况下

    占用多少字节=对象头+实例数据+对其填充/8

    如何诊断线程死锁的问题:(jvm 常用虚拟机的命令)
    Jps 查看当前服务器有哪些java虚拟机进程。


    image.png
    image.png

    jmap -head 进程id
    jmp工具 查看堆内存占用情况

    软件监控方式:
    Jsonsole工具 图形界面管理:线程,CPU 堆内存。


    image.png

    json 可以监控本地进程,也可以监控远程进程。


    image.png

    线程死锁为题诊断。

    产生背景: 同步中嵌套同步
    线程A首先获取onject锁, 在获取this 锁。
    线程B 首先获取this锁 在获取object锁。

    获取锁,释放锁。

    生产环境cpu标高的诊断:
    cpu飙高的原因:
    1,磁盘io(用户态切换到内核态)
    2,高并发的情况Tomcat线程池 通过cpu执行到我们的线程。
    3,业务代码和定时任务没分开,触发定时任务的时候 死循环。
    4, 被工具代码注入挖矿程序 阿里云服务器redis 6379 端口
    5,自旋锁(非常消耗cpu资源)

    避免cpu飙高
    解决cpu飙高
    cpu飙高核心点: 程序必须运行一段时间才可以发生

    相关文章

      网友评论

          本文标题:44 jvm 调优之线上生产环境手写智能报警系统

          本文链接:https://www.haomeiwen.com/subject/iiazdktx.html