[基础]Java内存和GC汇总

Java内存结构

主要来自JVM 8 定义。运行时数据区生命周期一部分与JVM绑定,一部分与线程绑定

pc寄存器

与线程绑定。指向当前方法地址(非native)或未定义(native)

JVM栈

与线程绑定

  • 栈中都是帧(Frame)[的指针]
  • Frame可以是new出来的,用来存储函数调用中的临时结果
  • 栈只有push和pop

与JVM绑定。用来放new出来的实例

函数区

与JVM绑定。用来保存编译后的中间代码。

运行时常量池

与类绑定。相当于扩大版的符号表(symbol table)。其实存在于函数区。

native方法栈

帧是函数运行的上下文,所有函数运行的相关数据(中间变量、返回值、异常、当前类)都存放在帧中。帧还负责动态链接、抛异常。帧可以理解成是ThreadLocal的

  • 本地变量:使用一个数组来存储,只有long和double占两个变量,其他都是单个变量。比较接近于组成原理的寄存器
  • 操作符栈:标准的行为,没什么特殊的
  • 动态链接:符号库和真实符号由帧负责对应上(虚函数感),这个提供了足够的动态能力
  • 帧会在函数结束运行时失效,这个可以帮助理解finally中return会导致catch中的throw失效

内存管理和GC

主要来自于OpenJDK说明文档

  • 分配内存时,可能通过RT也可能在编译时就把代码编译到执行位置。每个线程会有预留的内存分配buffer(TLABs)
分代
  • 分新老代,老生常谈了,不过这种基于行为特点进行优化很有参考价值
  • Young中能存活的对象很少,所以采用标记-拷贝的方法。此时不会进行全局扫描!!!
  • Old不主要采用拷贝,因为能回收的内存期望值比较低,更多对象是不会被回收的
  • Permanent是留个JVM用的
回收算法
  • short pause:标记以最高并行度进行,最终只是清理无用内存,并不拷贝对象
  • high throughput:也是搞并行度进行GC,但最后是通过拷贝来实现GC的,这样能给出更多的连续空间

话说,官方的东西,真简练。。。补充可以看这里还有这里

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值