A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 怀念黑海岸 中级黑马   /  2014-8-4 12:30  /  1320 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

       java官方提供的说明:java把内存分为了两块,一块是堆区,另外一个是非堆区。
       堆区:
       这个区域的主要作用是存放java程序执行时通过new关键字产生的对象实体,不管你这个对象是静态的,还是非静态的,公有的还是私有的,都存在这儿。因此,java的垃圾回收器gc()的工作就是专门针对这个区域而进行的。
       非堆区:
       又分为四个区域:
       1-->程序计数器:这个计数器来干嘛的呢?首先说这个区域的归属问题,这个区域是java虚拟机为线程分配的私有空间,每当一个线程启动时,jvm都会为其分配一个计算器,用来记录当前这个线程的执行状态,里面记录了诸如跳转,调用方法,判断分支等动作,因为cpu执行时间片的限制,一般一个线程不可能无限执行下去直到结束,这个记录器就是用来记录线程执行到了什么地方,当这个线程重新获得执行权时就是通过计数器来判断线从什么地方开始继续执行的。
      2-->栈区:栈区同样也是归属于线程私有的,当一个线程启动时,jvm也会为该线程分配一个固定大小、连续的一个区域,这个区域主要存放临时变量和方法中的基本数据类型,以及对象引用变量(属于这个线程中的各种对象中的属性,线程执行时产生的各种临时变量)。这个区间来干嘛的呢:他用来存放各种变量和记录线程执行深度的,何为线程执行深度,就是执行的次数,一般来讲,线程都不会在执行次数上产生什么问题,但是有个例外,那就是递归。在执行递归时可能抛出一个错误:StackOverflowError,这时就表示线程执行次数已经超过了规定的线程执行深度了。
     3-->本地方法栈区:这个区域是专门给本地方法用的,因为涉及到要操作底层数据,所以这个区域是没有执行深度的限制的。
     4-->方法区:这个区域里面又分为两个区域:A--常量区;B-->代码区。
     代码区里面存放的是类文件的.class文件以及相关信息。
     常量区里面则存放的是类级别的各种变量,何为类级别:就是被static修饰的。什么常量啊,静态引用变量啊。什么被static修饰的基本数据啊什么的。
     欢迎补充。

3 个回复

倒序浏览
学习了,加深理解。
回复 使用道具 举报
  有个地方写的有些模糊:补充下,对象中如果存在基本数据类型,那么这些基本数据类型是存放在对象内存实体中的,因为对象实体也有自己的空间,这些空间内存放的就是这些基本数据类型,如果对象中还定义了其他对象的引用变量,那么其他对象的引用也是存在于这个对象实体空间内,而这些其他对象实体则是存在于堆空间中的,这跟多维数组一样。多维数组的实体中记录的其实是其他低维数组的引用,其他低维数组的实体则是存在于堆空间的。
回复 使用道具 举报
学习了........
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马