background image

浅谈 JAVA 虚拟机(JVM 

1.概念:.

          JVM(Java Virtual Machine):Java 虚拟机,所有的 Java 程序都在 Java 虚拟机中运
行。
          元数据:在本文中指用于描述类和接口定义的数据。

2.遇到的问题

    在我做 J2EE 系统开发的工作生涯中,经常遇到技术人员或客户发出诸如此类的感慨:
我的 J2EE 应用系统处理的数据量不大,系统体积也不大,技术架构也没有问题,我的应
用服务器的内存有 4G 或 8G;系统运行起来很慢,还经常出现内存溢出错误。真是无奈!
每次遇到这样的情况,我心中都会忍不住窃笑之。

其实他们所遇到这种情况,不是技术架构上的问题,不是系统本身的问题,也不是

应用服务器的问题,也可能不是服务器的内存资源真的不足的问题。他们花了很多时间在
J2EE 应用系统本身上找问题(当然一般情况下,这种做法是对的;当出现问题时,在自
身上多找找有什么不足),结果还是解决不了问题。他们却忽略了很重要的一点:J2EE
应用系统是运行在 J2EE 应用服务器上的,而 J2EE 应用服务器又是运行在 JVM(Java 
Virtual Machine)上的。

3.不止一个 JVM

    其实在生产环境中 JVM 参数的优化和设置对 J2EE 应用系统性能有着决定性的作用。本
篇我们就来分析 JAVA 的创建者 SUN 公司的 JVM 的内存管理机制(在现实中绝大多数的
应用服务器是运行在 SUN 公司的 JVM 上的,当然除了 SUN 公司的 JVM,还有 IBM 的
JVM,Bean 的 JVM 等)。

4.JVM 的内存管理机制

     JVM 的早期版本并没有进行分区管理;这样的后果是 JVM 进行垃圾回收时,不得不
扫描 JVM 所管理的整片内存,所以搜集垃圾是很耗费资源的事情,也是早期 JAVA 程序
的性能低下的主要原因。随着 JVM 的发展,JVM 引进了分区管理的机制。
     采用分区管理机制的 JVM 将 JVM 所管理的所有内存资源分为 2 个大的部分。永久存储
区(Permanent Space)和堆空间(The Heap Space)。其中堆空间又分为新生区(Young 
(New) generation space)和养老区(Tenure (Old) generation space),新生区又分为伊甸园
(Eden space),幸存者 0 区(Survivor 0 space)和幸存者 1 区(Survivor 1 space)。具体