类加载过程 加载阶段–>链接阶段–>初始化阶段。
ClassLoader只负责类的加载,至于是否可以执行由Excution Engine决定。
加载阶段:将类的全限类名转化为二进制的字节流,再将字节流转入方法区,在内存中生成一个Class对象。
链接阶段分为:1.验证,确保Class文件的字节流符合当前虚拟机的要求;2准备:为类变量分配内存,并设置默认初始值。3.解析:将常量池内的符号引用转化为直接引用的过程。
初始化阶段:执行类的构造器方法(此构造器不是那个构造器,是Clinit,这个类只有静态的东西才会有)
为什么要自定义类记载器?
修改类的加载方式,扩展加载源,防止源码泄露
如何自定义记载器,继承ClassLoader类,逻辑写在finalclass方法。
栈是运行单位,即程序如何执行,如何处理数据,就像做菜一样,把一些变量处理。
栈内存大小:-Xss
栈中的数据都是以栈帧的形式存在。
索引是帮助mysql高效获取数据的排好序的数据结构。
mysql底层使用的是B+树,不过优化的,一个节点大小是16k。
B+树其实也是一种二叉树(右边节点比父节点打,左边节点比父节点小),索引都放在非叶子节点上,叶子节点还有所有的索引和数据。
为什么非叶子节点不放数据? 因为这样一行就可以放更多的索引,树的高度就更低。
存储引擎是形容表的。
myisam引擎:
myisam.frm 存储标的结构,MYD是存储数据的,MYI是存储索引的。
索引结构是B+树,所以myisam的索引文件和数据文件是分离的(非聚集),查找数据时,先从MYI文件的叶子节点找到对应位置,再去MYD找到对应的数据,所以是跨文件的。
聚集索引:叶节点包含完整的数据记录。
INNoDB引擎:必须有主键,只有主键才能弄起B+树的数据结构,为什么没有创建也行,因为innodb会自动选择一个数据不相同的字段作为主键,如果没有就自动生成一列主键。
推荐使用整型作为自增主键。
Innodb的数据结构:
B树一个节点都多个子女节点,节点之间没有指向的指针,但是B+
树有,还是双向指针。
Innodb的文件:
JVM由类加载器子系统,内存模型,字节码执行引擎构成。
栈帧的结构:
比如定义一个局部变量 int a =1; a就进入局部变量表,1进入操作数栈。
每个线程都有一个程序计数器,由字节码文件执行引擎修改程序计数器(当一个线程被挂起的时候知道从哪里开始运行)。
方法出口:就是一个方法执行完后该执行什么。
GC凭什么清理对象:
可达性分析算法:将“GC Roots”对象作为七点,从这个节点开始向下搜索引用的对象,找到的对象都被标记为非垃圾对象,其余未标记的对象都是垃圾对象
FullGC通常伴有STW(stop the world 停顿)造成用户体验,对于JVM调优就可以从这里出发,减少FUllGC的次数,可以增大年轻代的内存空间。
-Xmn设置年轻代的大小 ,-Xmn2048 设置大小为2G.