JVM的内存模型(Java Virtual Machine Structure)

        JVM 包含 Java 字节码的分析(JIT compiler)和 执行(Runtime),内置自动内存分配管理机制,避免手动分配回收机制可能带来的内存泄露和内存溢出风险,让 Java 开发人员不再需要关注每个对象的内存分配和回收问题,更专注于业务实现,提高开发效率,同时也会导致开发人员过度依赖于自动化,弱化对内存的管理能力,系统很容易发生 JVM 的堆内存异常、垃圾回收(GC)的方式不合适、 GC 次数过于频繁等问题,直接影响应用服务性能。

一、内存模型

 

        ps:红色线程隔离、绿色线程共享

        java 虚拟机官网文档:https://www.oracle.com/webfolder/technetwork/tutorials/mooc/JVM_Troubleshooting/week1/lesson1.pdf

1、堆(heap)

a、堆分为新生代、老年代,JVM 内存中最大的一块内存空间

 新生代由 Eden 和 Survivor 区(From Survivor 和 To Survivor )组成

  • JDK 1.6:有永久代,在非堆内存区,静态变量存放在永久代上
  • JDK 1.7:有永久代,在堆内存区,把字符串常量池、静态变量,存放在堆上。逐渐的减少永久代的使用。
  • JDK 1.8:无永久代,运行时常量池、类常量池,都保存在元数据区(元空间),字符串常量池仍然存放在堆上。

b、内存分配策略

 2、程序计数器(Program Counter Register)

主要用来记录各个线程执行的字节码的地址

3、方法区(Method Area)

HotSpot 虚拟机使用永久代来实现方法区,在其它虚拟机中,如Oracle 的 JRockit、IBM 的 J9 就不存在永久代一说。方法区只是 JVM 中规范的一部分

HotSpot 虚拟机在Java7 版本开始将永久代的静态变量和运行时常量池转移到了堆中,其余部分则存储在 JVM 的非堆内存中

在Java8 版本,将方法区中实现的永久代去除,使用元空间(class metadata 元空间的存储位置是本地内存)代替,原永久代的运行时常量池、静态变量(class static variables)同java7保存在堆上

        

Java8 为什么使用元空间替代永久代,这样做有什么好处?

1、为了融合 HotSpot JVM 与 JRockit VM 而做出的努力,因为 JRockit 没有永久代,所以不需要配置永久代。

2、永久代内存经常不够用或发生内存溢出,爆出异常 java.lang.OutOfMemoryError: PermGen,在 JDK1.7 版本中,PermGen 区大小为 8M,由于 PermGen 中类的元数据信息在每次FullGC的时候都可能被收集,回收率都偏低,还有,为 PermGen 分配多大的空间很难确定,PermSize 的大小依赖于很多因素,比如,JVM 加载的 class 总数、常量池的大小和方法的大小等。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值