1、类加载过程
1)、加载
a)、类的信息加载到方法区。
b)、类对象放在堆里。
2)、链接
a)、验证:文件格式,元数据,字节码,符号引用。
符号引用转为直接引用。
b)、准备: 为静态变量分配内存(方法区)。并初始化成默认值元数据验证。
c)、解析: 常量池中的符号引用替换为直接引用。
3)、初始化( clinit)
如果类没有被加载和链接,那就先加载和链接。
如果类存在直接的父类,先初始化直接父类。
如果类中存在初始化语句。那就依次初始化化语句。
双亲委派模型:先委托父类加载器寻找目标类,在找不到的情况下,在自己的路径中查找
沙箱安全机制:自己写的同名核心类不会被加载,这样便可以防止核心API库被随意篡改。
1、启动类加载器。rt.jar (java.lang, java.io.)
2、扩展类加载器 %JAVA_HOME%/lib/ext/
3、应用类加载器。classpath
4、自定义类加载器。(自定义路径)如:Tomcat
JVM对class文件是按需加载(运行期间动态加载)
JVM 运行时数据区:
1、Method Area (方法区)。
Runtime Constant Pool (运行时常量池)
2、Heap( 堆 )。
3、JVM Stacks (虚拟机栈)。
栈帧: 局部变量区、操作数栈、动态链接。
4、Native Method Statcks (本地方法栈)。
5、Program Counter Register (程序计数器)。
Java 调优命令:
jps :显示进程id
Jinfo: 查看正在运行的java应用程序的扩展参数。
jinfo -flags 进程号
Jstat: 查看堆内存的使用量,以及类加载的数量
jstat -class 进程号
jstat -gc 进程号
S0C :surivor 0区的大小
S1C:
S0U
S1U
EC:
EU
OC
OU
MC
YGC
CCSC
jstat -gcnewcapacity
jstat -gcold
Jmap: 查运行时内存信息、
jmap -histo 进程号 -> 内存文件
jmap -heap 进程号
jmap -dump:format=b,file=文件名 进程号
如: jmap -dump:format=b,file=eureka.hprof 12108
设置启动时的内存状况: -XX:+PrintGCDetatils -XX:+HeapDumpOnOutOfMemeoryError -XX:HeapDumpPath=D:\jvm.dump
jhat
Jstack: 程序所有线程的堆栈情况,排查死锁
jstack 进程号
jstack 找出占用CPU最高的堆栈信息