一、总体模型
1.1JVM内存布局
虚拟机栈:
在每个Java 方法被调用的时候,都会创建一个栈帧,一旦完成相应的调用,则出栈。所有栈帧都出栈了 ,线程就结束了 。
局部变量
程序计数器:
堆:
元空间:类的元数据,这些信息只对编译器或JVM的运行时才有用
1.2单个线程组成
问题
1) JVM内存区域如何划分
2)堆 、非堆、本地内存关系
二、内存划分
垃圾回收过程
核心:先找到活跃的对象,然后把其他不活跃的对象判定为垃圾,然后删除。
JC ROOT 代表可追溯对象
JVM过程
标记
清除
复制:解决内存碎片问题 ,进行内存整理,就是提供一个一个对象的内存空间,将存活的对象复制过去
整理:移动所有存活的对象,按照内存地址顺序依次排列,然后将末端内存地址以后的内存全部回收
问题
1)那些需要那些回收
垃圾回收是围绕GC ROOTS
GC ROOTS必须是活跃的引用
2)弱引用有什么用
弱引用相比较软引用,要更加无用一些 ,它拥有更短的生命周期
3)OOM的几个原因
1、内存容量太小了 ,需要扩容
2、错误的引用方式,发生了内存泄漏,没有及时切断与GC Root的关系
3、数据超出范围,比如数据库查询
4、对堆外内存无限制的使用
4)Java 程序是如何运行的
一个java 程序经过javac 编译成.class 文件,执行引擎执行这些字节码,调用操作系统接口
5) full GC 原因
1、调用System.gc
2、方法区空间不足
3、老年代空间不足
新创建的对象都会分配到Eden区,如果该对象占用内存非常大,则直接分配到老年区,此时老年区不足
做minor gc 曹祖,发现要移动的空间比老年代剩余空间要大,则触发full gc
参考:
https://blog.csdn.net/weixin_43207056/article/details/104536443