Tomacat中两个应用的spring版本不同,按照双亲委派机制的话会出问题
多生成一个类加载器
MyClassLoader c = new MyClassLoader(“war包地址”);
其中类装载子系统(在C++中执行)以及字节码执行引擎(在C++中执行)
一般都是new出来的对象,存放在堆中
存放局部变量(也可以叫做线程栈)
在JVM中一个方法对应一块栈帧内存区域
如果方法中还有局部变量的话
那么会在这个栈帧区域再生成一个栈用来存放局部变量
采用先进后出
局部变量表:存放类似于:a=1,b=2
操作数栈:就是操作运行中需要做操作的数据,相当于一个中间表
动态链接:在运行时,把符号引用转换为直接引用
方法出口:根据方法出口的信息放回到调用方法的指定位置
程序马上要运行的这一行代码的内存位置
作用:被另一个优先级更高的线程抢占了cpu之后,会告诉cpu从哪一行代码继续执行
Main main = new Main();
它会在栈帧的局部变量表中存放 对象main 在堆中的地址
作用:存放常量池/静态变量/类信息都会放在方法区中
需要调用本地方法的时候,给本地方法分配地址
本地方法:一开始JVM都是C语言实现的,
作用:停止所有用户的操作
Java虚拟机调优,主要就是减少full gc
底层收集垃圾的过程太复杂了,在找对象的过程中需要STW,不然还没找到垃圾对象,操作执行完了,变量对象都出栈了,栈和堆里的对象都变成了垃圾对象
对方法区需要设置内存值,默认是21M
栈的默认大小是1M
在 VM options 中设置 -Xms 512K
-Xss设置越小count值越小,说明一个线程栈里能分配的栈就越少,但是对JVM整体来说能开启的线程数会更多