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