java内存模型

  • 线程私有-程序计数器

1、当前线程所执行的字节码行号指示器(逻辑)
2、改变计数器的值来选取下一条需要执行的字节码指令
3、和线程是一对一的关系即“线程私有”
4、对Java方法计数,如果是native方法则计数器值为Undefined
5、不会发生内存泄漏

  • 线程私有——Java虚拟机栈

1、Java方法执行的内存模型
2、包含多个栈帧
在这里插入图片描述

  • 递归为什么会引发java.lang.StackOverflowError异常

递归过深,栈帧数超过虚拟栈深度。

  • 虚拟机栈过多会引发Java.lang.OutOfMemoryError异常

  • 线程私有——本地方法栈:与虚拟机栈相似,主要作用于标注了native的方法

  • 线程共享——元空间(MetaSpace)与永久代(PermGen)的区别

1、元空间使用本地内存,而永久代使用jvm内存。使得(java.lang.OutOfMemoryError:PermGen space)不复存在

  • MetaSpace相比PermGen的优势:

1、字符串常量池存在永久代中,容易出现性能问题和内存溢出
2、类和方法的信息大小难易确定,给永久代的大小指定带来困难
3、永久代会为GC带来不必要的复杂性
4、方便HotSpot与其它jvm如Jrockit的集成

  • 线程共享的堆——Java堆(Heap)

1、对象实例的分配区域在这里插入图片描述
2、GC管理的主要区域在这里插入图片描述

  • jvm三大性能调优参数-Xms -Xmx -Xss的含义:

1、-Xss 规定了每个线程虚拟机栈(堆栈)的大小(一般情况下256K足够了,此配置影响并发线程数的大小)
2、-Xms 堆的初始值
3、-Xmx 堆能达到的最大值
一般把Xms -Xmx设置成相同值(防内存抖动)

  • java内存模型中的堆和栈的区别----内存分配策略

静态存储:编译时确定每个数据目标在运行时的存储空间需求
栈式存储:数据区需求在编译时未知,运行时模块入口前确定
堆式存储:编译时或运行时模块入口都无法确定,动态分配

联系:引用对象、数组时,栈里定义变量保存堆中目标的首地址

java内存模型中堆和栈的区别
管理方式:栈自动释放,堆需要GC
空间大小:栈比堆小
碎片相关:栈产生的碎片远小于堆
分配方式:栈支持静态和动态分配,而堆仅支持动态分配
效率:栈的效率比堆高

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值