jvm内存模型

JVM

JVM主要是用于把java.calss字节码文件 翻译成机器上能运行的机器码,所以在很多平台上运行的结果都是一样的,所以jvm有跨平台性

计算机中运行最快的就是内存,所以jvm就把数据加载到内存种(也就是运行时数据区),内存管理涉及到内存分配/垃圾回收
在这里插入图片描述
JVM在运行过程中会把他所管理的内存划分成若干不同的数据区域!

  • 线程私有:程序计数器,本地方法栈,虚拟机栈
  • 线程共有:堆和方法区
    在这里插入图片描述
    线程私有区域内存的生命周期随这线程的, 线程跑的时候才会有虚拟机栈

程序计数器:指向当前正在执行的字节码指令的地址(行号),不会发生内存溢出的(涉及到字节码)

为什么需要程序计数器?因为java是多线程的,意味着线程有切换, CPU在处理线程1 突然需要暂停 启动另外一个线程,程序计数器就可以保证jvm多线程的情况下线程的正常执行。


栈:(stack) 一种数据结构,数据结构就是用来存储数据的,栈的特点是先进先进后出,而java中如果方法A吊用方法B,方法B吊用方法C,那就是A先进栈依次BC,而出来的时候C先出依次BC,所以JVM中使用栈这种数据结构。
在这里插入图片描述
虚拟机栈:存储当前线程运行方法所需数据,指令,返回地址 ----虚拟机栈大小设置 -Xss 默认1M

虚拟机栈中有多个栈帧,一个栈帧代表一个方法。

虚拟机栈会发生内存溢出:stackoverflowerror 排查代码 肯定有死循环或者无限递归,不推荐改虚拟机栈的大小

并且在多线程高并发的情况下,-Xss =128K 最合理 几百上千行,因为栈区一共1G 每个站1M的话只能支持1000个线程并发
在这里插入图片描述

-Xss128K
public static void main(String[] args) throws Throwable{
JavaVMStack oom=new JavaVMStackSOF();
oom.function();
}  

public void function(){
count++//可以尝试获取次数 用Trowable抛出
intxxxxx 定义很多相当于扩大每个栈帧 只能减少报错时的次数;
function();
}

javap -v XXX.class >a.txt 反编译 ,反编译后就能看到很多字节码文件

局部变量表:static静态变量,final常量存储在线程共享的方法区。而方法中 new object()对象放在堆中(但是只有进入方法的时候才会有),而方法中定义的局部变量就在虚拟机栈栈帧中的局部变量表中,其中对象存放的是他在堆中的引用地址,一般0号位都会放this,局部变量表的寻址范围一般32位,2的32次方4个G ,64位可以高低位存储。

操作数占:方法中代码对栈的操作就放在操作数栈 bipush store那些字节码就是入栈出站的操作

动态链接:支持多态

返回地址:运行完当前方法后需要返回的地方,如果不返回的话就会发生递归吊用
在这里插入图片描述
JVM内存模型JMM,java堆的参数大小设置-Xmx最大 -Xms初始

JMM中是一个内存模型 jdk1.8之前分为新生代(eden区 两个交换区From to 8:1:1),老年代 1:2,永久代,其中新生代和老年代的合集对应的堆,而永久代对应的是方法区,方法区1.8之后叫元空间

对象在内存中优先在Eden区分配,大对象(超过eden区的大小)直接进入老年代,长期存活的对象(GC回收在交换区交换15次还没被回收)进入老年代,动态年龄判断(交换区放不下)

对象回收-----判断对象的存活:引用计数算法(超过使用次数就回收,有很大缺点),可达性分析算法(在java中可作为GC ROOT的对象 方法区中静态 常量引用的对象, 虚拟机栈 本地方法栈中的引用对象)

新生代中MinorGC(线程定时触发或者内存不够) 复制回收算法 8:1:1 因为平时90%是不需要清理的,不然复制回收算法浪费内存,所以10%作为交换区

老年代FULL GC 标记清除 标记整理算法

JVM问题处理方式:OutOfMemoryError GC overhead
在这里插入图片描述
直接分配内存
在这里插入图片描述
保存堆栈快照日志、分析内存泄漏、调整内存设置、控制垃圾回收频率,选择合适的垃圾回收器;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值