Интервьюер, Java8 структура памяти виртуальной машины Java изменилась, генерация постоянного Метапространства

JVM в Java8, а затем в структурах памяти медленно изменяется. Как интервьюер, если вы не знаете, процесс интервью не какое-то невежество еще раз? Как интервьюер, если знать об этих изменениях, в свою очередь, станет изюминкой интервью.

Если поиск конфигурация памяти JVM в сети, 90% может быть найдена в Java7 и предыдущую карту памяти, эта статья будет о структуре памяти утонченности JVM снова, глубоком пониманием внутренних изменений после Java8. Теперь Италия ××× «выгоды от него. Здесь вы можете постоянно обновлять свои знания и понимание.

JVM структура памяти утонченность

Посмотрите на структуру памяти диаграммы JVM.

Интервьюер, Java8 структура памяти виртуальной машины Java изменилась, генерация постоянного Метапространства

Для получения более подробных объяснений, мы ссылаемся на этот график для дальнейшей оптимизации настройки. Для java7 и предыдущих версий уточнения.

Интервьюер, Java8 структура памяти виртуальной машины Java изменилась, генерация постоянного Метапространства

Смотрите некоторые изменения? Heap и область метод связаны друг с другом, но это не говорит, что куча и область метод вместе, они все еще разделены логически. Но физически говоря, они также непрерывный блок памяти. Другими словами, метод и площадь перед Эдема, и мы говорили о старых-х непрерывен.

Интервьюер, Java8 структура памяти виртуальной машины Java изменилась, генерация постоянного Метапространства

Прежде чем продолжить работу по-прежнему, мы сначала понять два понятия: спецификации и реализации.

Спецификация и реализация

Есть специальный «Java Virtual Machine Specification» для реализации виртуальной машины Java При условии соблюдения норм, разные производители имеют различные реализации виртуальной машины. Как и определение интерфейса, чем процесс развития, конкретный интерфейс может быть реализован в соответствии с различными потребностями бизнеса.

PS: У нас есть необходимость взглянуть на "Java Virtual Machine Specification ×××", ответ "002" выиграл виртуальную машину Java SE 7 спецификации PDF версия.

Как правило, мы используем Java SE обеспечивается Sun JDK и OpenJDK, которая является наиболее широко используемой версией. В то время как VM использует версию HotSpot VM. При нормальных обстоятельствах, это относится к версии HotSpot мы говорим о виртуальной Java-машине.

Постоянное поколение (PermGen)

После того, как вы понимаете выше спецификации и реализации, понимание взглянуть на концепции «постоянного поколения (Permanet поколения, также известный как PermGen)». Привыкшие к виртуальной машине HotSpot на разработку, развертывание, программистов, многие из них готовы к методу области под названием постоянных поколений.

本质上来讲两者并不等价,仅因为Hotspot将GC分代扩展至方法区,或者说使用永久代来实现方法区。在其他虚拟机上是没有永久代的概念的。也就是说方法区是规范,永久代是Hotspot针对该规范进行的实现。

理解上面的概念之后,我们对Java7及以前版本的堆和方法区的构造再进行一下变动。

Интервьюер, Java8 структура памяти виртуальной машины Java изменилась, генерация постоянного Метапространства

再重复一遍就是对Java7及以前版本的Hotspot中方法区位于永久代中。同时,永久代和堆是相互隔离的,但它们使用的物理内存是连续的。

永久代的垃圾收集是和老年代捆绑在一起的,因此无论谁满了,都会触发永久代和老年代的垃圾收集。

但在Java7中永久代中存储的部分数据已经开始转移到Java Heap或Native Memory中了。比如,符号引用(Symbols)转移到了Native Memory;字符串常量池(interned strings)转移到了Java Heap;类的静态变量(class statics)转移到了Java Heap。

然后,在Java8中,时代变了,Hotspot取消了永久代。永久代真的成了永久的记忆。永久代的参数-XX:PermSize和-XX:MaxPermSize也随之失效。

元空间(Metaspace)

对于Java8,HotSpots取消了永久代,那么是不是就没有方法区了呢?当然不是,方法区只是一个规范,只不过它的实现变了。

在Java8中,元空间(Metaspace)登上舞台,方法区存在于元空间(Metaspace)。同时,元空间不再与堆连续,而且是存在于本地内存(Native memory)。

Интервьюер, Java8 структура памяти виртуальной машины Java изменилась, генерация постоянного Метапространства

本地内存(Native memory),也称为C-Heap,是供JVM自身进程使用的。当Java Heap空间不足时会触发GC,但Native memory空间不够却不会触发GC。

Интервьюер, Java8 структура памяти виртуальной машины Java изменилась, генерация постоянного Метапространства

针对Java8的调整,我们再次对内存结构图进行调整。

元空间存在于本地内存,意味着只要本地内存足够,它不会出现像永久代中“java.lang.OutOfMemoryError: PermGen space”这种错误。看上图中的方法区,是不是“膨胀”了。

默认情况下元空间是可以无限使用本地内存的,但为了不让它如此膨胀,JVM同样提供了参数来限制它使用的使用。

  • -XX:MetaspaceSize,class metadata的初始空间配额,以bytes为单位,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当的降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize(如果设置了的话),适当的提高该值。
  • -XX:MaxMetaspaceSize,可以为class metadata分配的最大空间。默认是没有限制的。
  • -XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为class metadata分配空间导致的垃圾收集。
  • -XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为class metadata释放空间导致的垃圾收集。

永久代为什么被替换了

思考一下,为什么使用元空间替换永久代?

表面上看是为了避免OOM异常。因为通常使用PermSize和MaxPermSize设置永久代的大小就决定了永久代的上限,但是不是总能知道应该设置为多大合适, 如果使用默认值很容易遇到OOM错误。

当使用元空间时,可以加载多少类的元数据就不再由MaxPermSize控制, 而由系统的实际可用空间来控制。

更深层的原因还是要合并HotSpot和JRockit的代码,JRockit从来没有所谓的永久代,也不需要开发运维人员设置永久代的大小,但是运行良好。同时也不用担心运行性能问题了,在覆盖到的测试中, 程序启动和运行速度降低不超过1%,但是这点性能损失换来了更大的安全保障。

小结

После объяснения эволюции и выше, не является более глубоким пониманием структуры памяти виртуальной машины Java? И больше, чем интервьюер может общаться на некоторое время, в конце концов, интервьюер не так много времени.

рекомендация

отblog.51cto.com/14230003/2447159