JVM в Java8, а затем в структурах памяти медленно изменяется. Как интервьюер, если вы не знаете, процесс интервью не какое-то невежество еще раз? Как интервьюер, если знать об этих изменениях, в свою очередь, станет изюминкой интервью.
Если поиск конфигурация памяти JVM в сети, 90% может быть найдена в Java7 и предыдущую карту памяти, эта статья будет о структуре памяти утонченности JVM снова, глубоком пониманием внутренних изменений после Java8. Теперь Италия ××× «выгоды от него. Здесь вы можете постоянно обновлять свои знания и понимание.
JVM структура памяти утонченность
Посмотрите на структуру памяти диаграммы JVM.
Для получения более подробных объяснений, мы ссылаемся на этот график для дальнейшей оптимизации настройки. Для java7 и предыдущих версий уточнения.
Смотрите некоторые изменения? Heap и область метод связаны друг с другом, но это не говорит, что куча и область метод вместе, они все еще разделены логически. Но физически говоря, они также непрерывный блок памяти. Другими словами, метод и площадь перед Эдема, и мы говорили о старых-х непрерывен.
Прежде чем продолжить работу по-прежнему, мы сначала понять два понятия: спецификации и реализации.
Спецификация и реализация
Есть специальный «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及以前版本的堆和方法区的构造再进行一下变动。
再重复一遍就是对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)。
本地内存(Native memory),也称为C-Heap,是供JVM自身进程使用的。当Java Heap空间不足时会触发GC,但Native memory空间不够却不会触发GC。
针对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? И больше, чем интервьюер может общаться на некоторое время, в конце концов, интервьюер не так много времени.