【说一千道一万】Java内存

关于JAVA内存由于是自学一直看网上的各种版本,一直没有一个比较全面的说法,自己下一步会去看《深入理解JVM》来完善自己的知识。


暂时自己先就网上各种版本来做一下总结。

一、JVM的内存分配:堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(Program Counter Register):

比较的公认的说法,还有的说法是堆区(Heap Memory)、非堆区(Non-Heap Memory),基本是一致的。

每个JVM实例都会有一个方法区和一个内存堆,这些是共同在虚拟机内运行的线程。

对于堆,JVM只有一个堆区,被所有线程共享,堆中不存放任何的基本类型和对象引用,只存放对象本身。在堆中产生了一个数组或者对象时,在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就变成了该数组或对象的引用变量(类似指针)。

对于方法区,JVM只有一个方法区,跟堆一样,被所有的线程共享,用于存储虚拟机JVM加载的类信息、常量、静态变量。简单来说方法区包含在整个程序中永远唯一的元素,如class、static变量。

——说到方法区就要提到常量池(Constant Pool),两种说法是一种说法是常量池属于方法区,另一种说法是不属于方法区,它用于存放编译期生成的各种字面量(String、Integer、Float等)和符号引用(类型、字段、方法),这部分内容将在类加载完后放在常量池中。

对于栈和程序计数器,我们都知道Java是多线程的,每一个线程即有一个程序计数器和内存栈,他们都是线程私有的,不共享。

——程序计数器不用多说,它是一个寄存器,占用一个较小的内存空间。

——栈,在程序中定义的一些基本数据类型的变量和对象的引用变量都在栈内存中分配。


看起来比较正确的样子~

二、JVM的三代划分:

另外一种常见的说法是JVM分为三代:年轻代(Young Generation)、年老代(Old Generation)和持久代(Permanent Generation)。

首先,要知道三代是HotSpot的概念,HotSpot即是最新使用的JVM。

所有新生的对象都是存在年轻代的,年轻代的目标就是尽快收集掉那些生命周期短的对象,在年轻代经历了N次(可配置)垃圾回收后仍存活的对象,就会被复制到年老代中,因此可以认为在年老代中存放的是一些生命周期较长的对象,在年轻代的垃圾回收叫Young GC、年老代的垃圾回收叫做Full GC。

持久代中主要用于存放静态类型数据,如Java Class、 Static Method等,所以一种说法是方法区=持久代。



合百家之言:http://www.cnblogs.com/Cratical/archive/2012/08/21/2649985.html

http://www.open-open.com/lib/view/open1432200119489.html

http://blog.csdn.net/qq_18344939/article/details/52224185

Give me Your galaxy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值