JVM内存格局总结

最近一次面试,面试官让我讲讲JVM的内存这一块的理解。我回答的不满意,今天做一个总结。

做一个产品,最终要做到高并发、高可靠。归根结底,是对CPU、内存等资源受限所作出的解决方案。就内存而言,我们写的代码:如new一个对象,都要在内存中来运行,如果内存中没有足够的空间,不能创建新的对象,那么程序就无法运行。所以,在调试程序的过程中我们可以经常看到OutOfMemory之类的错误。在Java中我们知道有垃圾回收机制GC来解决内存泄露的问题,那么它是如何解决的呢?了解这部分知识,我想:1.内存是如何划分的?2.内存是如何管理的?3.GC是如何工作的?(其源码?)4.针对内存问题,技术的发展是怎么一步步的解决这些问题的?(当然有软件、硬件发展两个方面)。

一,先解决内存是如何来划分的?

  在PC中,内存用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换数据。我们常用的软件是安装在计算机的硬盘上的,当执行该软件的时候,才把它调用内存来运行。硬盘用于保存:需要永久保存的、大量的数据。内存用于保存:临时的、少量的数据和程序。此刻,我用Office软件,用键盘向电脑敲入文字,文字先被存储在内存中,当选择保存的时候,内存中的数据才会写入磁盘中。

  内存用半导体存储单元制作而成。包括RAM随机存储器、ROM只读存储器、CACHE高速缓存。其中,ROM由于其永久保存、只读不写的个性,我们在ROM中存放计算机的基本程序和数据,如计算机的BIOS选项中的部分。ROM中的部分不受电脑断电的影响,但是RAM中的东西,则会随着电源关闭而数据丢失,我们常购买的内存条就是RAM集成块集中在一起的一小块电路板,RAM中的数据可以读也可以写。缓存这个东西Cache,我们经常听到的名词,比如一级缓存、二级缓存、三级缓存等。缓存是一个位于CPU和内存之间的,一个读写速度比内存更快的存储器。当CPU向内存中写入或读出数据时,这个数据也被存储高速缓冲存储器中。当CPU再次需要这些数据时,CPU就从高速缓冲存储器读取数据,而不是访问较慢的内存,当然,如需要的数据在Cache中没有,CPU会再去读取内存中的数据。

  地址空间,是对物理存储器编码的范围。即是对每一个物理存储单元(一个字节)分配一个号码,通常叫做编址。分配一个号码给一个存储单元的目的是为了找到它,完成数据的读写,这就是所谓的“寻址”。所以地址空间就是寻址空间。我们常说的,我的电脑是内存4G的,就是地址空间是4G,寻址空间是4G,也就是,为每一个字节分配一个号码,总共有4*1024*1024*1024字节。因为KB的含义就是k*Byte.

  知道了上面这些,那么我们接下来要研究的其实就是RAM这一部分了。我们把这一部分知识也常常叫做Java内存的组成。

JVM内存格局总结

java内存分为:堆Heap和非堆Non-Heap区。java虚拟机具有一个堆,堆是运行时数据区域,所有实例和数组的内存均从此处分配。堆是Java虚拟机启动时创建的。在java堆之外的内存称为non-heap memory。JVM主要管理堆和非堆两种类型的内存。堆是留给开发人员使用的。非堆是JVM留给自己使用的,所以方法区、JVM内部处理或者内部优化所需要的内存(JIT编译后的代码缓存)、每个类的结构(运行时常数池、字段、方法数据)以及方法和构造方法的代码都在非堆内存中。

堆,(java代码中所有的new操作),JVM对堆的初始分配的内存由-Xms指定,默认是物理内存的1/64.JVM给堆最大分配的内存由-Xmx指定,默认是物理内存的1/4.当默认堆内存小于40%的时候,JVM就会增大堆直到-Xmx的最大限制。空余堆内存大于70%时,JVM会减少直到-Xms的最小限制。(有时候,服务器设置-Xms和-Xmx大小相等,目的是避免每次GC后需要调整堆的大小)对象的堆内存由称为垃圾回收器的自动内存管理系统回收。

未完待续......

上一篇:PHP开发利器zend studio常见问题解答


下一篇:CSS3 pointer-events:none应用举例及扩展