目录:
java虚拟机汇总
- class文件结构分析
1).class文件常量池中的常量项结构
2). 常用的属性表的集合 - 类加载过程
1).类加载器的原理以及实现 - 虚拟机结构分析
1).jdk1.7和1.8版本的方法区构造变化<<== 现在位置
2).常量池简单区分 - 对象结构分析
1).压缩指针详解 - gc垃圾回收
- 对象的定位方式
首先要明白方法区是一个概念(存放方法的信息),jdk1.7即以前的实现是永久代,
jdk8以及以后是元空间
jdk1.6:
jdk7以前的hotspot里面的结构有,堆。栈。永久代,程序计数器
此时的方法区,hotspot的实现是永久代,
永久代(方法区)存放的内容有
- 类信息。。
- 字段。。
- 方法。。
- 静态变量和全局变量
- 运行时常量池(里面包含字符串常量池)
- Class引用
- ClassLoader的引用
- 方法表
jdk1.7:
然后在1.7版本迎来了一些改动
永久代中的静态变量和运行时常量池中的字符串常量池转移到了堆中,
也就是说全局变量和其他常量(非字符串常量)还遗留在永久代中
jdk1.8:
移除了永久代,用元空间代替(这里看出jdk7的操作是预先操作) 为什么?
- 字符串存在永久代中,容易出现性能问题和内存溢出
- 类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小 容易出现永久代溢出,太大则容易导致老年代溢出
- 永久代会为 GC 带来不必要的复杂度,并且回收效率偏低
- 将 HotSpot 与 JRockit 合二为一
以上是好处,稍微记忆一下,这里大家只需知道,在原来永久代的东西都被搬到了元空间,所以相对于1.7版本我们并不需要记多少东西,还依然是字符串常量池和静态变量装到了堆中,其余的装到元空间