首页 > 其他分享 >jvm相关

jvm相关

时间:2024-02-22 23:55:48浏览次数:29  
标签:XX 逃逸 线程 内存 jvm 相关 列出

1、查看当前垃圾回收器指令:

java -XX:+PrintCommandLineFlags -version

2、STW:

在执行垃圾回收线程的时候,停止所有任务线程

3、CMS

初始标记和重新标记需要STW

4、三色标记算法

黑白灰的标记,在并发标记阶段

5、G1

分区

6、jvm调优命令
  • jps:列出Java的进程
  • jinfo [进程号] :列出该进程的信息
  • jstat -[gc] [进程号] [500]:跟踪gc进程的参数,列出内存区域的大小,500表示每500毫秒刷新信息
  • jstack [进程号]:跟踪线程,列出该进程的所有线程的信息
  • jmap :查堆内存对象占用的比重、生成堆转储文件导出。不能在生产环境使用,会使jvm卡死
    • jmap -histo [进程号]:列出所有对象的内存情况
      • jmap -histo 11988 | head -20:列出前面20个
    • jmap -dump:format=b,file=20230922.hprof 11988:生成一个叫20230922.hprof 的文件,可以使用Javajdk自带的jvisualvm.exe图形化界面导入查看分析
  • -XX:+HeapDumpOnOutOfMemoryError:当出现OOM的时候自动生成堆转储文件
7、jvm的cpu爆了怎么查
7.1
  • 先查哪个线程占用cpu:top
  • 查对应进程的哪个线程占用cpu:top -Hp [进程号(PID)]
  • 根据线程编号,使用jstack命令查看线程信息,将之与上面 top -Hp的线程编号对应,找出占用cpu的线程信息
  • 判断是gc线程还是业务线程,假如是GC(vm thread)则读GC的日志
7.2 使用阿里的arthas工具查看状态
  • java -jar arthas-boot.jsr 会列出进程的号和信息,输入对应的进程号,可以挂到对应的运行程序中
  • dashboard:仪表盘
  • heapdump:与jmap一样
  • thread:列出线程
    • thread -b:查找死锁
  • jvm:列出jvm的常用参数
  • jad:反编译列出源代码
  • redefine:编辑对应的类代码,编译该Java文件成class文件后,执行该命令(redefine /root/TT.class),可替代对应的class,即在线修改代码不用重启
  • trace:跟踪代码执行情况和时间
8、Java调优的实质
  • 调的是参数,共三类参数:”-“开头的是标准参数,”-X“开头的是非标准参数,”-XX“。调优主要是调”-XX“的参数
  • 什么是调优:
    1. 根据需求进行jvm规划和预调优
    2. 优化jvm运行环境(慢、卡顿)
    3. 解决jvm运行过程中出现的各种问题(OOM)
      • 内存泄露:memory leak
      • 内存溢出:out of memory
      • Full GC 是老年代的内存回收
9、类加载-初始化
  1. 加载过程

    1. loading

      1. 双亲委派,主要出于安全考虑

        1. 如何打破双亲委派机制:重写loadClass方法,当要加载两个同名类的时候,需要打破
        2. 热部署需要重新new一个loader替换原来的loader(tomcat的热部署实现)
      2. lazyloading必须初始化的五种情况

        1. -new getstatic putstatic invokestatic 指令,访问final变量除外
        2. java.lang.reflect对类进行反射调用
        3. 初始化之类的时候,父类首先初始化
        4. 虚拟机启动时,被执行的主类必须初始化
        5. 动态语言支持java.lang.invoke.MethodHandle解析的结果为REF_getstatic REF_putstatic REF_invokestatic的方法句柄时,该类必须初始化
      3. ClassLoader的源码

        findlnCache->parent.loadClass->findClass()

      4. 自定义加载器

        1. extends ClassLoader
        2. overwrite findClass() -> defineClass(byte[]->Class clazz)
        3. 加密
      5. 混合执行 编译执行 解释执行

        1. 检测热点代码:-XX:CompileThreshld = 10000
    2. linking

      1. verification:验证文件是否符合jvm规定

      2. perparation:静态成员变量赋默认值

      3. resolution:将类、方法、属性等符号引用解析为直接引用

        如常量池中的各种符号引用解析为指针、偏移量等内存地址的直接引用

    3. initialing:调用类初始化代码

  2. 总结:

    1. load 默认值 - 初始值
    2. new 申请内存 - 默认值 - 初始值
10、Java对象栈上分配与逃逸

栈上分配条件:不会逃逸的对象有机会进行栈上分配。

逃逸的条件:给成员变量赋值、方法返回值、实例引用传递。

只能在server模式下才能启用逃逸分析,参数-XX:DoEscapeAnalysis启用逃逸分析,参数-XX:+EliminateAllocations开启标量替换(默认打开)。Java SE 6u23版本之后,HotSpot中默认就开启了逃逸分析,可以通过选项-XX:+PrintEscapeAnalysis查看逃逸分析的筛选结果。

  • client模式

    • client模式是默认的JVM启动模式,适用于小型应用程序和客户端应用程序。在client模式下启动JVM,JVM会使用较小的堆空间,这样可以快速启动应用程序并占用较少的内存。
    • client模式对于较小的应用程序可以提高启动速度,但是对于大型应用程序的性能表现不太理想,因为较小的堆空间会导致更频繁的垃圾回收,降低应用程序的性能。
  • server模式

    • server模式是适合于大型应用程序和服务器应用程序的启动模式。在server模式下启动JVM时,JVM会使用更大的堆空间和更高的优化级别,以获得更好的性能表现。

image

11、逃逸分析的作用

通过逃逸分析,在不存在逃逸下JVM可以进行以下优化:

  • 同步消除。线程同步本身比较耗时,如果确定一个变量不会逃逸出线程,无法被其他线程访问到,那么这个变量的读写就不会存在竞争,对这个变量的同步措施可以清除。

  • 将堆分配转为栈上分配:在一般应用中,不会逃逸的局部对象占比很大,如果使用栈上分配,那大量对象会随着方法结束而自动销毁,减轻垃圾回收系统压力。

  • 分离对象或标量替换:标量就是不可分割的量,java中基本数据类型,reference类型都是标量。相对的一个数据可以继续分解,它就是聚合量。如果把一个对象拆散,将其成员变量恢复到基本类型来访问就叫做标量替换。如果逃逸分析证明一个对象不会被外部访问,并且这个对象可以被拆散的话,那么程序真正执行的时候可能在栈上创建若干个成员变量。

垃圾处理器,新生代GC--老年代GC:

pn--cms

ps--po

标签:XX,逃逸,线程,内存,jvm,相关,列出
From: https://www.cnblogs.com/luzriu/p/18028457

相关文章

  • 推荐两个网络复用相关的 Go pkg: cmux smux
    推荐两个网络复用相关的Gopkg:cmux/smux只写一下如何使用,不对实现进行大量描述,两个库的代码都比较精炼,花一会看一下就行。cmux对端口进行复用,单端口可以建立不同协议的连接(本质都是TCP),如TCP/TLS/HTTP/gRPC或自定义协议smux对TCP连接复用,单TCP连接承载多条smuxstream......
  • 【数据结构】C语言实现二叉树的相关操作
    树定义树(Tree)是n(n>=0)个结点的有限集若n==0,称为空树若n>0,则它满足如下两个条件:有且仅有一个特定的称为根(Root)的结点其余结点可分为m(m>=0)个互不相交的有限集T1,T2,T3,...Tm,其中每一个集合本身又是一棵树,称为根的子树(SubTree)术语结点:数据元素结点的度:结点......
  • 最小生成树相关理解
    最小生成树边权的多重集合是唯一最小的!而且顺着排序之后字典序也最小。证明是容易的,利用克鲁斯卡尔的过程归纳即可。还有一种我独创的证法:考虑配对。如果有两种生成树,把两棵树拍到一起,然后B树的边(x,y)可以和A树上的路径(x,y)上的点匹配,根据霍尔婚姻,显然具有完美匹配,又......
  • static相关
    1.代码块publicclassStaticDemo{{System.out.println("匿名代码块");}static{System.out.println("静态代码块");}publicStaticDemo(){System.out.println("构造函数");}publicstaticv......
  • JVM
    概述Java不是最强大的语言,但是JVM是最强大的虚拟机。常见的JVM:Sun公司Classic和HotSpot、BEA公司的JRock、IBM的J9、Graal虚拟机是未来发展的方向。Java虚拟机的启动是通过引导类加载器(bootstrapclassloader)创建一个初始类(initialclass)来完成的,这个类是由虚拟机的具体实......
  • Flink 使用之 TypeInformation 由于泛型类型在运行时会被JVM擦除,所以要指定类型
    Flink使用之TypeInformation由于泛型类型在运行时会被JVM擦除,所以要指定类型Flink使用介绍相关文档目录Flink使用介绍相关文档目录背景本篇从近期遇到的StreamJavaAPI问题,引出TypeInformation的使用。Exceptioninthread"main"org.apache.flink.api.common.functi......
  • css样式相关代码记录
    element样式穿透:::v-deepposition属性值有static、relative、absolute、fixed、sticky。static:该关键字指定元素使用正常的布局行为,即元素在文档常规流中当前的布局位置。relative:该关键字下,元素先放置在未添加定位时的位置,再在不改变页面布局的前提下调整元素位置(因此会......
  • python相关知识
    1python原理Python先把代码编译成字节码,交给虚拟机执行。.pyc文件是字节码在磁盘上的表现形式字节码在虚拟机程序里面对应的对象是PyCodeObject对象(C++对象)PyCodeObjecttypedefstruct{PyObject_HEADintco_argcount;/*位置参数个数*/intco_nlocals;......
  • finally语句块相关面试题
    publicstaticvoidm(){try{System.out.println("try...");System.exit(0);}finally{System.out.println("finally...");}}上述程序中,finally语句块中的内容还能被执行吗?答:不能被执行......
  • 分布式下的数据拆分,读写分离,分库分离相关问题
    一、为什么要用分库分表当不使用分库分表的情况下,系统的性能瓶颈主要体现在:当面临高并发场景的时候,为了避免Mysql崩溃(MySql性能一般的服务器建议2000/s读写并发以下),只能使用消息队列来削峰。受制于单机限制。数据库磁盘容量吃紧。数据库单表数据量太大,sql越跑越慢而分库分......