JVM初探

243 阅读1分钟

java memory结构

memory划分

java memory主要分heap memory 和 non-heap memory,其计算公式如下:

Max memory = [-Xmx] + [-XX:MaxPermSize] + number_of_threads * [-Xss]


  • heap结构
按分代,分young-eden,young-survivor,old
用-Xmn,-Xms,-Xmx来指定
  • non-heap结构

包括metaspace,thread stacks,compiled native code,memory allocated by native code

-XX:PermSize或-XX:MetaspceSize,-Xss或-XX:ThreadStackSize

PermGen与Metaspace

字符串常量池的变化


  • 在java7的时候将字符串常量池则移到java heap
所有的被intern的String被存储在PermGen区.PermGen区使用-XX:MaxPermSize=N来设置最大大小,但是由于应用程序string.intern通常是不可预测和不可控的,因此不好设置这个大小。设置不好的话,常常会引起

方法区的变化

  • java8的时候去除PermGen,将其中的方法区移到non-heap中的Metaspace
move name and fields of the class, methods of a class with the bytecode
of the methods, constant pool, JIT optimizations etc to metaspace
  • Metaspace属于non-heap
Metaspace与PermGen之间最大的区别在于:Metaspace并不在虚拟机中,而是使用本地内存。


Metaspace相关参数

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

引用:

PermGen与Metaspace区别
Java性能调优:利用VisualVM进行性能分析