jvm 运行时数据(内存) 分为多个区域
线程私有部分:
1.程序计数器(指向正在执行字节码指令的地址(行号))
java是多线程的,可以记录当前线程执行状态,保证程序正常执行
2.本地方法栈,虚拟机栈
栈是一种数据结构,出入口只有一个,特点:先进后出
主要是用来存储java执行时的方法中的信息
一个栈帧代表一个方法:
局部变量表:(一般第一个存放this)存放变量地址的引用
操作数栈:方法中的代码对栈进行操作
动态连接:支持多态,
返回地址:运行完当前方法,返回的地址
生命周期:跟随线程的,可能会内存溢出(栈的深度大于最大深度(递 归,导致栈溢出 StackOverflowError))
多线程时,建议将栈的大小(-Xss)设置小点 例如128k
线程共享部分:堆和方法区
方法区:类的信息,静态变量,常量
堆:JMM(JVM内存模型)
<jdk1.8 -xms -xmx
新生代(100):
Eden(80m):对象优先分配在Eden取
s1(10m):交换区
s2(20m): 用于GC 复制算法
老年代(200m):
大对象直接进入老年代
长期存活的的对象也会分配到老年代(15次)
动态年龄判断:多个对象交换区放不下,就一起移动到老年代
永久代:
对象的 回收 ----判断对象的存活(可达性分析) GC ROOTS
1.方法区:类镜头属性引用对象
2.方法区:常量引用对象
3.虚拟机栈(本地变量表)对象
4.本地方法栈(Native方法)中引用的对象
新生代:Minor GC() 线程 除了定时器会调用,当内存不足时也会调用
老年代:Full GC 当老年代满了才会调
复制回收算法Copying 适合于新生代
标记-清除算法:使用后可使用内存不是连续的,有碎片
标记-整理算法:将已用内存整理到一起
JVM处理问题:
1.OOM后保存堆栈快照日志
2.分析内存泄漏
3.调整内存设置
4.控制垃圾回收频率 full GC
5.选择适合的垃圾回收器