JVM内存模型深度刨析

JVM体系结构

在这里插入图片描述

java语言的挂平台特性

在这里插入图片描述

JVM的整体结构及内存模型

在这里插入图片描述
概述:
类加载子系统将编译好的.class文件加载进jvm
1.堆 线程共享, 存放的是对象
2.栈 线程私有,存放的是局部变量,也可已存放对象,我喜欢叫它线程栈,因为开启一个main线程就会在栈中划出一小块内存空间,内存空间就是栈空间,栈中存放一个个栈帧(一个方法对应一个栈帧),栈帧中存放 :局部变量表(存放的是局部变量例如 int a=0;存放的就是a),操作数栈(例如int a=0,存放的是0,不过0会被压入局部变量表赋值给局部变量,操作数栈是一个临时存放值的空间),动态链接(运行时会执行main方法中的代码,比如int a=0在main方法中,int,a,0这些是符号引用,会将符号应用替换成直接引用,直接引用存放在常量池中),main方法比较特殊,main方法的局部变量表中存放的是对象的引用,就是对象的内存地址,指向堆中的对象
3.本地方法栈 线程私有,c++语言编写的方法
4.方法区 线程共享,.class文件存放的位置,常量,静态变量,类信息,classloader的引用,class对象的引用等
5.程序计数器 线程私有,记录当前字节码执行的行数,存在的意义在于当前线程挂起的在执行时,可以找到当前执行的位置,不用从头加载
6.字节码执行引擎 线程私有,执行程序计数器指向位置的代码,改变程序计数器指向的位置
7.gc,分为Eden区,Survivor区,老年代,前两个是年轻代,当Eden中的对象存储满时会触发垃圾回收,回收有用的对象,无用的对象遗弃。回收的对象放入s0区,Eden满时继续回收,回收的是Eden区和s0区的仿佛s1区中,继续回收,回收Eden区的和s1区的放入s0区,回收一次对象的年龄加1最多加到15,这个可以自己设置年龄。当到15时对象存入老年代,老年代内存满时,会触发OOM异常,在gc时候可能会触发STW机制,当前线程挂起,等待回收。对用户的感觉是卡了一下。
为什么会触发STW:如果当前gc没有执行完而main线程执行完了,意味着方法执行完了,方法中的变量及对象全部出栈就没有作用了。那么这些对象还没有gc就被出栈,会造成很大问题。
8,一个线程中有程序计数器,栈,本地方法栈。这些都是线程私有的。

JVM内存参数

在这里插入图片描述
StackOverflowError示例:
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值