JVM(Hotspot)

java虚拟机是运行在操作系统之上的,它与硬件没有直接的交互!!!

程序运行的过程

类加载器

运行时数据区

  • 99%的垃圾回收操作都是在堆上,所谓的JVM调优实际上就是在对堆的一个调优!!!

执行引擎

JDK不同版本JVM变化

  • jdk6:存在永久代,静态变量存放在永久代。

  • jdk7:存在永久代,逐步去永久代;将字符串常量池静态变量移动到了堆空间中。

  • jdk8:永久代,类型信息、字段、方法、常量保存在本地内存的元空间(Metaspace),字符串常量池、静态变量仍然在堆中。

思考

  1. 为什么将字符串常量池移入到堆中?(为什么去永久代,改为元空间?)

    1. 字符串存在永久代中,容易出现性能问题和内存溢出,因为字符串应该是程序中非常常用的。
    2. 类及方法的信息等比较难确定大小,因此对于永久代的大小指定比较困难。
    3. 永久代会为GC带来不必要的复杂度,并且回收效率很低。
    4. Oracle将HotSpot与JRockit合二为一,借鉴了后者虚拟机的优点。

其他虚拟机

BEA JRockit,IBM J9不做过多介绍。