1_JVM内存模型
2022-10-07 13:48:15 0 举报
AI智能生成
JVM内存模型脑图
作者其他创作
大纲/内容
JDK体系结构与跨平台特性
JDK体系结构
JDK = JRE(Java Runtime Enviroment) + 命令工具
JRE = JVM + 类库工具
JRE = JVM + 类库工具
跨平台
JVM屏蔽了不同操作系统在底层硬件和指令上的区别
JVM内存模型
JVM虚拟机组成部分
类装载子系统
运行时数据区
字节码执行引擎
执行代码修改程序计数器、开启垃圾收集线程
运行时数据区(内存模型)(补图)
虚拟机栈
又叫线程栈,线程开始运行,会分配一块栈空间,当线程中调用一个方式时,就会产生一个栈桢进入线程栈
栈帧主要构成
局部变量表
放置方法中的局部变量
操作数栈
实际操作的值
动态链接
存储的是符号引用对应的直接引用地址,程序运行过程中,将符号应用转化为直接引用
方法出口
存储调用方法的返回位置
堆
存储对象,分为年轻代和老年代,占比一般为1:2
年轻代又分为Eden区和两个Survivor区,占比一般为8:1:1
一般新产生的对象都分配在Eden区,当Eden满了,会触发minor GC,minor GC具体清理哪些对象呢?这就要用到可达性分析了(最开始也用引用计数法,但其存在循环引用问题,可达性分析怎么解决循环引用的?)
年轻代又分为Eden区和两个Survivor区,占比一般为8:1:1
一般新产生的对象都分配在Eden区,当Eden满了,会触发minor GC,minor GC具体清理哪些对象呢?这就要用到可达性分析了(最开始也用引用计数法,但其存在循环引用问题,可达性分析怎么解决循环引用的?)
本地方法栈
非java方法调用栈,线程独有
程序计数器
放置代码运行位置的内存地址,字节码执行引擎,每执行完一行代码就会去修改程序计数器的值
为什么每个线程都要有一个?线程切换
方法区(元空间)
常量(运行时常量池)+静态变量+类元信息
元空间默认初始值为21M,如果不设置方法区大小,最终可以扩展到剩余所有本地内存
元空间有自动伸缩机制,触发FullGC后,不仅去做类型卸载,还会对原空间的初始大小进行调整,根据FullGC回收后的大小,决定初始大小
调整元空间需要FullGC
建议初始和最大大小设置为一样,不设置可能会产生频繁FullGC
元空间有自动伸缩机制,触发FullGC后,不仅去做类型卸载,还会对原空间的初始大小进行调整,根据FullGC回收后的大小,决定初始大小
调整元空间需要FullGC
建议初始和最大大小设置为一样,不设置可能会产生频繁FullGC
Gc Roots和STW机制
GC Roots
将GC Roots对象作为起点,向下查找引用的对象,将其标记为非垃圾对象,其余的都为垃圾对象
GC Roots对象:静态变量、虚拟机栈的本地变量、本地方法栈的变量等
STW机制
当对象不断增加,对象在Eden区和survivor区不断minorGC,每次minorGC都会使存活对象分带年龄+1,当分代年龄大于15时,对象会被挪到老年代,如果survivor区域放不下minorGC的后的对象,这些对象也会被放置到老年代,当老年代对象越来越多,最终会触发FullGC,FullGC会回收整个堆和方法区。如果还无法释放内存,最终可能会OOM。MinorGC和FullGC的时候会产生STW,即停止所有用户线程等待垃圾收集线程结束。
为什么会设计STW机制?不停用户线程会有什么影响
JVM参数设置
前置知识:JVM内存参数设置
java -Xms2048M -Xmx2048M -Xmn1024M -Xss512K -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -jar microservice-eureka-server.jar
-Xss值设置的越小,理论上支持的线程数越多
-Xss值设置的越小,理论上支持的线程数越多
JVM调优目的:减少FullGC,降低MinorGC频次
算法题
斐波那契数列
跟昨天的一样,,不过取模是对每次的结果取模,而不是直接结果取模
0 条评论
下一页