手动导入一位灵魂画手朋友所作的概略图
简单介绍下几个内容:
一、 JVM按照大区域共3个:
1、类装载子系统:主要用于从文件系统或者网络中加载class文件
2、字节码执行器:程序最终的形态都是机器可识别的字节码,需要一个能识别此类字节码的引擎来执行程序字节码
3、运行时数据区:其中包含程序运行时候的一些模块,重点理解。
接下来我们简单说说运行时数据区的内容分为5个区域
1、堆:对象的保存
2、方法区:类的信息,常量、和一些静态变量等。
3、栈:虚拟机栈,存栈帧和对象指针(索引)
4、本地方法栈:核心内容的保存调度,由c++来完成
5、程序计数器:记录程序执行的状态,位置等信息记录
在栈和堆这里我们再重点聊一下:
-栈、除了指针索引外,在每加载一个方法的时候就会往栈里面压入此方法的栈帧。它主要包含了图中几个部分,从方法层面来看不外乎是局部变量表,操作数栈,动态链接,方法出口等。
1、局部变量表里面包含了方法中定义的一些变量如a=0;中的a这个变量。
2、如1中描述的变量值0,程序会操作这块儿来进行计算,它会放于操作数栈中,并且新的结果值也是放在这里的
3、首先链接分为静态链接:如果一个class文件被装载进JVM内部,被调用的目标方法在编译期可知,且运行期间不变时,将符号引用转为直接引用的过程称为静态链接。动态链接:编译期无法确定,只能在程序运行期间将调用方法的符号引用转为直接引用。
4、方法的返回
二、JVM参数设置
Spring Boot程序的JVM参数设置格式(Tomcat启动直接加在bin目录下catalina.sh文件里)。
JVM内存参数大小该如何设置?
JVM参数大小设置并没有固定标准,需要根据实际项目情况分析,给大家举个例子这里引用了大佬的内容
上图为堆中gc的资源分配比例和划分。
以下一个场景的设计
可调用例:
java -Xms3072M -Xmx3072M -Xss1M -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M
这样的配置的话,大概14秒会进新一次新生代gc。请求高并发过程,几分钟内的热点活动。这样gc的频率太高了。影响用户体验。这时候可以增加新生代区的资源大小。
如果尽量减少full gc 的次数可以这样弄一弄
java -Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M
结论:通过上面这些内容介绍,大家应该对JVM优化有些概念了,就是尽可能让对象都在新生代里分配和回收,尽量别
让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时给系统充足的内存大小,避免新生代频繁的进行垃
圾回收.
未完待续!!!!!!!!!!