谈谈Java虚拟机优化与垃圾回收
对于JVM的原理就不多说了,去google一下或者在 互联网百科全书 上搜索一下也能找到非常好的介绍,那么我们先谈谈JVM中的参数设置,别小看这些将要设置的参数,他将决定了JVM的处理能行,但也不是设的越大越好,不然JVM的垃圾收集器工作的太频繁反而降低了性能,而是需要有个折中的设置, 你可以设置 -Xmn (最小),-的XMS(初期)和- Xmx(最大)对堆大小参数进行调整,前提是你需要对机器的性能和配置有一定的了解,特别需要对机器的内存大小进行关注。 “堆”细分为在JVM的生命周期中使用的若干组成部分。这里有一个快速分类:

堆分为两个领域:新一代和老一代。在新一代的空间中有一个叫Eden的空间,主要是用来存放新生的对象,还有两个Survivor Spaces(from,to), 它们用来存放每次垃圾回收后存活下来的对象。在Old Generation中,主要存放应用程序中生命周期长的内存对象,还有个Permanent Generation,主要用来放JVM自己的反射对象,比如类对象和方法对象等。

当一个URL被访问时,内存申请过程如下:
- JVM会试图为相关Java对象在Eden中初始化一块内存区域
- 当Eden空间足够时,内存申请结束。否则到下一步
- JVM试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收), 释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区Survivor区被用来作为Eden及OLD的中间 交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区
- 当OLD区空间不够时,JVM会在OLD区进行完全的垃圾收集(0级)
- 完全垃圾收集后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”out of memory错误”
–end–

本文由J2ee企业顾问-黄毅创作,并已采用创作共用署名2.5中国大陆版许可证授权。





