类加载器的所用:加载class文件
一.类加载器包括:
启动类加载器:加载java核心类,jre/lib/rt.jar
扩展类加载器: 它负责加载JRE的扩展目录,lib/ext或者由java.ext.dirs系统属性指定的目录中的JAR包的类。
应用类加载器: JVM启动时加载来自Java命令的-classpath选项、java.class.path系统属性,或者CLASSPATH换将变量所指定的JAR包和类路径。
自定义加载器:重写loadClass打破双亲委派
JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化。
二.类什么时候被加载
1.实例化
2.访问类的静态变量/静态方法
3.放射class.forName("")
三.类什么时候被卸载
非自定义加载器加载的类不会被卸载,除非程序自己结束
自定义类加载器类何时卸载:
1、该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
2、加载该类的ClassLoader已经被回收。
3、该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。
双亲委派机制:向上查询,向下加载,目的为了:避免重复加载类,为了安全
沙箱安全机制:
native本地方法:为了扩展其他语言的使用,最初是为了调用C/C++,在内存中开辟
方法区:存放静态变量,常量,类信息,运行时的常量池
PC寄存器:
栈:一个线程一个栈,一个方法一个栈帧
栈帧:局部变量表,操作数栈,方法出口
堆:一个jvm只有一个堆内存,对内存大小可以调节
垃圾回收主要在新生代和老年代
新生代:eden space sivivorFrom sivivorTo MinorGC
类的诞生和成长和死亡的地方
老年代:FullGC
永久代:物理上不存在,逻辑上存在。1.8以后叫元空间,元空间的类信息单独存储在JVM之外的内存中
-xms 最小堆内存
-xmx 最大堆内存
内存快照:jmap -dump:format=b,file=heap.bin<pid>
MAT/Jprofile
dump文件快速定位内存问题,获取大对象