深入Java虚拟机(2):JVM内存结构详解

       我的上一篇讲了关于Java类的生命周期和类加载机制中有涉及到JVM虚拟机内存,这篇文章就详细介绍关于JVM内存的结构、内存中不同区域的主要职责,在描述各区域的职责的同时,还会说到具体不同内存区域中的具体结构空间以及这些结构布局的目的及特性,了解这些基础的东西对在今后学习或者工作开发当中出现了有关内存的问题就可以很快的定位问题然后解决问题,另外结合内存结构再学习关于垃圾回收相关的知识内容又可以进行更高级的jvm调优、GC调优等等,博主会通过文章一步一步的与大家一起学习、进阶,希望读者每一步的学习都能学的非常透彻。

      注:本文相关图片资源来源均在文尾给出参考文献来由

       JVM内存也就是经常说的运行时数据区,程序在计算机当中跑就意味着会用到内存来存放数据、程序执行的指令等,相比C++、C一些底层的开发语言来说,Java开发者不需要把重心放在对象在内存中的分配与销毁等工作,这样也就大大减少因人为造成的内存泄漏和内存溢出问题,简化了开发者的工作,而这些都是得益于Java虚拟机对内存的管理,包括运行时对对象自动分配内存空间,以及对对象的销毁工作(垃圾回收相关),结合上一篇的的内容,已经知道了java类被加载后在虚拟机内存的分布情况,本文不单讲述内存结构、每个内存的职责外还会讲解一个程序中类的实例、方法、字段、静态字段等在内存中的分布情况,从内存的角度去分析有关内存问题。

我们先讲述内存结构和每个区域的职责:

上面为jvm内存的结构图,java虚拟机启动之后会将某个内存空间划分一个运行时数据区,该区域里分布着上述五个区域,五个内存区域中方法区和堆是线程共享的,其他三个区域是每个线程在执行程序是自己独有的内存数据区,这也就说明方法区和堆中存放的内容可以给所有线程共同访问的,现在我们来看每个区域的详细解释:

Java堆(Heap)

职责: 简而言之就是存放对象实例(也就是程序创建类的实例)

根据堆的职责就会产生一个问题需要思考:大家知道一个应用程序中会涉及到频繁地对类进行实例创建(也就是new操作),那在整个程序运行中意味着堆中会不断的存放新的实例对象,而内存是有大小限制的,如果在堆中一直进行给实例对象分配空间,堆的空间肯定就不够用了,大家可以用程序无限创建实例看看,当堆的空间不够并无法扩展之后会抛出OutOfMemoryError异常,通过这个问题说明了堆这块内存区域是需要被进行空间管理的,那如何被管理呢?就是垃圾回收机制(GC),也正是因为这样的问题存在,所以java堆是垃圾回收器主要管理的区域,现在对堆的垃圾回收机制都是采用分代收集算法(在这里暂时不详细讲解垃圾回收机制,什么是分代收集算法、为什么堆会用这样的回收方式,我在GC(垃圾回收)算法和垃圾回收器这篇文章中有详细介绍),在这我先描述堆这块区域内的结构分布:

大家只看Heap这块区域同宽度的下面区域可以看出堆里面的结构划分为:年轻代和老年代࿰

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值