内存模型和参数调优
javac编译原理是什么
跨平台,鱼和熊掌不可兼得。
java虚拟机的内部组成:
堆:new的对象都是在堆上。
栈(线程):放局部变量的。栈帧。符合后进先出的性质。
字节码文件
javap
JVM指令手册(Orcle官方网站):
程序计数器:保存我当前线程马上要运行的下一行代码的位置。
程序计数器的设计与线程的启动有关!
当前线程挂起后,再恢复线程运行的时候,要用到程序计数器。
程序计数器的值如何变化?
是字节码执行引擎执行class文件后修改的
动态链接:将符号引用转变为直接引用
方法名变量名都是符号引用
直接引用就是方法 在方法区域内部的内存入口地址
JVM是c语言和汇编语言实现的,要想理解透JVM还要解析源码,用到C语言
方法出口:在调用方法的时候,就会有方法出口生成,让方法执行完毕后,回到制定的位置
引用 指针
main的栈内部的局部变量和在堆里面的对象就是引用的关系 (堆:存的是内存地址)
栈和堆之间是一个指针关系。
方法区(元空间):常量+静态变量+类信息。
对象都是放在堆里
本地方法栈:调用本地方法,也要用内存。
本地方法:用native修饰的方法,是用c语言实现的,调用了一些c语言的函数。
堆:
minor gc是什么 垃圾收集
垃圾收集线程:
gc roots 可达性分析算法
没有被引用
堆会放满,触发gc(年轻代gc)垃圾收集,收集非垃圾对象,将垃圾对象清理掉。
如果没有被清理掉,分带年龄会加1
老年代放满了,触发fullgc回收我们整个堆区域。如果老年代清理不掉对象触发OOM内存溢出。
JVM调优工具:
jvisualvm
Jmap
Jstack
阿里巴巴Arthas
阿里巴巴好强呀
STW: stop the world
JVM真正的目的:
gc会STW
前台做操作,后台突然GC了, 他会停掉用户的线程,造成卡顿,影响用户体验。
STW蚂蚁金服面试题目。
STW机制:
不STW,gc还没有结束,用户的线程就结束了,我之前标记为非垃圾的,变成了垃圾。就会乱套了。
不同的垃圾收集器,它的底层的STW是有区别的。
减少GC,JVM最终调优的目的是减少STW。
负GC是什么。
full GC
JVM调优的一个方案:
通过分析你的业务场景,然后设置JVM各区域内存比例大小。所以必须了解JVM的原理细节。
RocketMQ:
Kafka:
每种垃圾收集器的适用场景。
Java类加载机制
.class的二进制很多都是放在元数据区。
堆区的对象会有一个指针指向元数据区。
但是BootStrap ClassLoader在他的元数据区已经构建好对象了。但是在堆和栈中没有构建相应的对象,所以打印的是空。
从java的意义上看,它只能看到栈和堆中的变量。
我们加载一个类最典型的方式是通过classLoader的loadClass方法。
native是jvm中的c++实现的。
准备:为静态变量分配内存。把对象的内存先给固定下来。
解析:我的内存当中,很多指针是需要指向我堆当中的一些东西,这个时候,在我的类没有加载完成的时候,这个指针还没办法知道指向哪,就可以称为是符号引用。当我这个内存的地址确定好了之后,那这个指针就真正指向内存当中具体的一个地址,这个时候可以称为直接引用。
半初始化: 将内存先占住,默认值是0,在后续的初始化过程中。再讲0给成我所需要的值。
final