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图形化界面导入查看分析
- jmap -histo [进程号]:列出所有对象的内存情况
- -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“的参数
- 什么是调优:
- 根据需求进行jvm规划和预调优
- 优化jvm运行环境(慢、卡顿)
- 解决jvm运行过程中出现的各种问题(OOM)
- 内存泄露:memory leak
- 内存溢出:out of memory
- Full GC 是老年代的内存回收
9、类加载-初始化
-
加载过程
-
loading
-
双亲委派,主要出于安全考虑
- 如何打破双亲委派机制:重写loadClass方法,当要加载两个同名类的时候,需要打破
- 热部署需要重新new一个loader替换原来的loader(tomcat的热部署实现)
-
lazyloading必须初始化的五种情况
- -new getstatic putstatic invokestatic 指令,访问final变量除外
- java.lang.reflect对类进行反射调用
- 初始化之类的时候,父类首先初始化
- 虚拟机启动时,被执行的主类必须初始化
- 动态语言支持java.lang.invoke.MethodHandle解析的结果为REF_getstatic REF_putstatic REF_invokestatic的方法句柄时,该类必须初始化
-
ClassLoader的源码
findlnCache->parent.loadClass->findClass()
-
自定义加载器
- extends ClassLoader
- overwrite findClass() -> defineClass(byte[]->Class clazz)
- 加密
-
混合执行 编译执行 解释执行
- 检测热点代码:-XX:CompileThreshld = 10000
-
-
linking
-
verification:验证文件是否符合jvm规定
-
perparation:静态成员变量赋默认值
-
resolution:将类、方法、属性等符号引用解析为直接引用
如常量池中的各种符号引用解析为指针、偏移量等内存地址的直接引用
-
-
initialing:调用类初始化代码
-
-
总结:
- load 默认值 - 初始值
- 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会使用更大的堆空间和更高的优化级别,以获得更好的性能表现。
11、逃逸分析的作用
通过逃逸分析,在不存在逃逸下JVM可以进行以下优化:
-
同步消除。线程同步本身比较耗时,如果确定一个变量不会逃逸出线程,无法被其他线程访问到,那么这个变量的读写就不会存在竞争,对这个变量的同步措施可以清除。
-
将堆分配转为栈上分配:在一般应用中,不会逃逸的局部对象占比很大,如果使用栈上分配,那大量对象会随着方法结束而自动销毁,减轻垃圾回收系统压力。
-
分离对象或标量替换:标量就是不可分割的量,java中基本数据类型,reference类型都是标量。相对的一个数据可以继续分解,它就是聚合量。如果把一个对象拆散,将其成员变量恢复到基本类型来访问就叫做标量替换。如果逃逸分析证明一个对象不会被外部访问,并且这个对象可以被拆散的话,那么程序真正执行的时候可能在栈上创建若干个成员变量。
垃圾处理器,新生代GC--老年代GC:
pn--cms
ps--po
标签:XX,逃逸,线程,内存,jvm,相关,列出 From: https://www.cnblogs.com/luzriu/p/18028457