你必须了解的java内存管理机制(二)-内存分配

 

前言

  在上一篇文章中,我们花了较大的篇幅去介绍了JVM的运行时数据区,并且重点介绍了栈区的结构及作用,相关内容请

public static void main (String[] args){   People p = new People(); }
复制代码

 

  这样的代码大家一点也不会陌生,我们都知道使用new关键字可以创建一个对象,对应的字节码如下

 

咦!一看字节码才知道,我们的一行new的代码,对应的字节码原来要做这么多操作!我们逐一来分析一下。

一、new指令

      1、检查、加载相应类

  JVM遇到new指令时,先检查指令参数(上面字节码中的#2)是否能在常量池中定位到一个类的符号引用(上面最终定位到常量池中的com/test/entity/People):

1)、如果能定位到,检查这个符号引用代表的类是否已被加载、解析和初始化过;

2)、如果不能定位到,或没有检查到,就先执行相应的类加载过程;

具体类的加载、解析、初始化的过程大家可以去查找JVM类加载机制相关资料,这里就不展开啦!我们需要知道的是这一步保证了在方法区中,存在要创建实例对象的类对象

         

       2、空间分配

  咱们到了适婚年龄,也就该找个对象了吧!你看上了一个姑娘,长得楚楚动人,就跑去跟他妈说:“我要一个对象,把你女儿嫁给我吧!”。她妈妈倒是十分爽快:“好啊,我女儿总得有个地方住吧,小伙子你有房吗?”。这时候场面一度十分尴尬,心里嘀咕着“要是国家能分配房子就好了!”。这在当前社会显然不现实,毕竟咱们还没进入共产主义社会!然而在JVM王国里,对象住的“房子”却是“国家”统一分配的。国家集中圈了一大块“地”,谁家要娶“媳妇”,就给他家分配一块“地”,“媳妇”胖点呢,地就大一点,“媳妇”瘦一点呢,“地”就小一点。在这里,你一个人可以同时拥有多个对象,在这里,多个人可以拥有同一个对象。所以这里的老百姓安居乐业、这里一片祥和……当然,由于这块“地”大小有限,而你又同时拥有很多对象,还有其他人也要娶对象,所以那些不用了的对象的“地”国家就会进行统一征收(当然这里不会给补贴,毕竟是免费分配的~)以继续分给其他人用。

上面扯了这么多,相信你已经知道“你”就代表着一个线程,“国家”指的是JVM,“国家”圈的一块“地”就是堆空间,你娶的“对象”就是实例对象,“国家”分配地的动作就是内存分配,而国家征收的动作就是垃圾回收。

由于要找对象的人太多了,所以分配的操作也很频繁,那么摆在“国家”的问题

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信