【JVM】JVM内存模型的演变

1  前言

讲多了Class文件、类加载过程,我们的Class文件就要进到JVM内存里了,那就先来了解下JVM内存模型都进行了哪些演变。

主要演变的就是:1.7、1.8 都是对方法区中的改变

概念的统一:我看一些文章说方法区、有永久代、有元空间这三者的关系是什么呢

(1)方法区可以看作是JVM逻辑上管理一片区域的名字也是概念,可以把它比作成接口

(2)永久代和元空间是对方法区的实现,只不过1.7及以前是永久代,1.8开始永久代被替换成元空间了

我们这里是针对主流的HotSpot的JVM进行的。

2 内存模型演变

每个版本基本都包含五大部分:栈、堆、本地方法栈、方法区、程序计数器

看运行时数据区要以线程的角度去看,其中:栈、本地方法栈、程序计数器都是线程私有,堆和方法区是线程共享的。

2.1 JVM1.6及以前的版本

1.6及以前JVM运行时数据区,方法区叫永久代

2.2 JVM1.7

1.7永久代还存在,但是已经逐步”去永久代“,字符串常量池、静态变量移到堆中。

2.3 JVM1.8及以后

1.8以后,无永久代,类型信息、字段、方法、常量直接保存在元空间,元空间用的是直接内存,字符串常量池和静态变量还是保持在堆中。

 小结:

3 思考

3.1 永久代为什么要被元空间替换?

  • 永久代设置空间大小是很难确定的。在某些场景下,如果动态加载类过多,容易产生Perm 区的OOM 。比如某个实际web工程中,因为功能点比较多,在运行过程中,要不断动态加载很多类,经常出现致命错误。
  • 对永久代进行调优是很困难的。

3.2 字符串常量池为什么调整?

因为永久代的回收效率很低,在full gc的时候才会触发。而full gc是老年代的空间不足、永久代不足时才会触发。这就导致stringTable回收效率不高。而我们开发中会有大量的字符串被创建,回收效率低,导致永久代内存不足。放到堆里,能及时回收内存。

posted @ 2023-02-13 07:26  酷酷-  阅读(68)  评论(0编辑  收藏  举报