类的生命周期
- 加载:找class文件
- 验证:验证格式
- 准备:静态字段,方法表
- 解析:符号解析为引用
- 初始化:构造器,静态变量赋值,静态代码块
- 使用
- 卸载
2,3,4属于链接
三类加载器
- 启动类加载器:加载jvm核心 rt.jar。(底层实现c++)
- 扩展类加载器:提供的扩展,可主动调用
- 应用类加载器(自己的jar包加载的类加载器)
加载器特点(如何避免重复加载)
- 双亲委托:从上级加载器查找该类,如果没有则加载
- 负责依赖:代码中依赖的jar包都需要加载
- 缓存加载:加载一次后缓存
JVM内存结构
栈:类的局部变量和对象的引用地址,每启动一个线程就创建一个栈.
堆:类的静态变量和类的定义
线程执行过程中,一般会有多个方法组成调用栈(Stack Trace),比如A调用B.没执行到一个方法,就会创建对应的栈帧(Frame)
如果试用JNI(底层c++),会单独起一个栈
堆内存结构
分代
java启动参数
堆内存参数
-Xmx, 指定最大堆内存。 如 -Xmx4g. 这只是限制了 Heap 部分的最大值为4g。
这个内存不包括栈内存,也不包括堆外使用的内存。
-Xms, 指定堆内存空间的初始大小。 如 -Xms4g。 而且指定的内存大小,并
不是操作系统实际分配的初始值,而是GC先规划好,用到才分配。 专用服务
器上需要保持 –Xms 和 –Xmx 一致,否则应用刚启动可能就有好几个 FullGC。
当两者配置不一致时,堆内存扩容可能会导致性能抖动。
-Xmn, 等价于 -XX:NewSize,使用 G1 垃圾收集器 不应该 设置该选项,在其
他的某些业务场景下可以设置。官方建议设置为 -Xmx 的 1/2 ~ 1/4.
-XX:MaxPermSize=size, 这是 JDK1.7 之前使用的。Java8 默认允许的
Meta空间无限大,此参数无效。
-XX:MaxMetaspaceSize=size, Java8 默认不限制 Meta 空间, 一般不允许设
置该选项。
-XX:MaxDirectMemorySize=size,系统可以使用的最大堆外内存,这个参
数跟 -Dsun.nio.MaxDirectMemorySize 效果相同。
-Xss, 设置每个线程栈的字节数。 例如 -Xss1m 指定线程栈为 1MB,与XX:ThreadStackSize=1m 等价
GC相关
-XX:+UseG1GC:使用 G1 垃圾回收器
-XX:+UseConcMarkSweepGC:使用 CMS 垃圾回收器
-XX:+UseSerialGC:使用串行垃圾回收器
-XX:+UseParallelGC:使用并行垃圾回收器
// Java 11+
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
// Java 12+
- 各个 JVM 版本的默认 GC 是什么? -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC
jdk内置命令行工具
java:启动
jps\jinfo:查看java进程 jps -mlv
jstat:查看jvm内部gc相关信息
jmap:查看heap或类占用空间统计;jmap heap pid:打印堆内存(/内存池)的配置和使用信息
jstack:查看线程信息
jcmd:执行jvm相关分析命令(整合命令)
jrunscript/jjs:执行js命令
JVM核心技术-JVM命令行工具
-
java Java应用的启动程序
-
javac JDK内置的编译工具
-
javap 反编译class文件的工具
-
jps/jinfo 查看java进程
- -lmv 进程详情
-
jstat 查看JVM内部gc信息
- -gc
- -gc
-
jmap 查看heap或类占用空间统计
- -heap 打印堆内存
- -histo 看哪些类占用的空间最多
-
jstack 查看线程信息
-
jcmd 执行JVM相关命令
-
jjs 执行js命令