欢迎访问本站,祝大家玩得愉快。

Java 8中JVM的变化

Java kany.wang 1742℃ 0评论

什么是JVM

JVM(Java Virtual Machine,Java虚拟机),Java程序的跨平台特性主要是指字节码文件可以在任何具有Java虚拟机的计算机或者电子设备上运行,Java虚拟机中的Java解释器负责将字节码文件解释成为特定的机器码进行运行。
因此在运行时,Java源程序需要通过编译器编译成为.class文件。
众所周知java.exe是java class文件的执行程序,但实际上java.exe程序只是一个执行的外壳,它会装载jvm.dll(windows下,下皆以windows平台为例,linux下和solaris下其实类似,为:libjvm.so),这个动态连接库才是java虚拟机的实际操作处理所在。
JVM是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。
Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。
所以,JAVA虚拟机JVM是属于JRE的,而现在我们安装JDK时也附带安装了JRE(当然也可以单独安装JRE)。

JVM的厂商

  • HotSpot
  • Oracle JRockit
  • IBM J9
  • Taobao JVM (要不要支持国产呢,哈哈哈哈)

其实还有很多的,就不举例了,基本上大家使用到的主要是Sun的HotSpot,毕竟我也是的。以下主要讲的是HotSpot。

JVM内存区域划分

JVM的内部体系结构分为三部分,分别是:
- 类装载器(ClassLoader)子系统
- 运行时数据区
- 执行引擎

划分如下图:
JVM运行时数据区

我们经常会看见java.lang.OutOfMemoryError: PermGen这个异常,相信很多人多遇到过,然后会使用下列参数来修改配置:

  • -XX:PermSize
  • -XX:MaxPermSize

但是在Java 8 的时候JVM进行了修改。与 Oracle JRockit 和 IBM JVM类似,JDK 8.HotSpot JVM开始使用本地化的内存存放类的元数据,这个空间叫做元空间(Metaspace)。

元空间

介绍

  • 它是一个本地堆内存中的一部分
  • 它可以通过-XX:MetaspaceSize和-XX:MaxMetaspaceSize来进行调整
  • 当到达XX:MetaspaceSize所指定的阈值后会开始进行清理该区域
  • 如果本地空间的内存用尽了会收到java.lang.OutOfMemoryError: Metadata space的错误信息。
  • 和持久代相关的JVM参数-XX:PermSize及-XX:MaxPermSize将会被忽略掉,并且在启动的时候给出警告信息。
  • 充分利用了Java语言规范中的好处:类及相关的元数据的生命周期与类加载器的一致

内存分配模型:

  • 绝大多数的类元数据的空间都从本地内存中分配
  • 用来描述类元数据的类也被删除了,分元数据分配了多个虚拟内存空间
  • 给每个类加载器分配一个内存块的列表,只进行线性分配。块的大小取决于类加载器的类型, sun/反射/代理对应的类加载器的块会小一些。
  • 不会单独回收某个类,如果GC发现某个类加载器不再存活了,会把相关的空间整个回收掉。这样减少了碎片,并节省GC扫描和压缩的时间。

调优:

  • 使用-XX:MaxMetaspaceSize参数可以设置元空间的最大值,默认是没有上限的,也就是说你的系统内存上限是多少它就是多少。
  • 使用-XX:MetaspaceSize选项指定的是元空间的初始大小,如果没有指定的话,元空间会根据应用程序运行时的需要动态地调整大小。
  • 一旦类元数据的使用量达到了“MaxMetaspaceSize”指定的值,对于无用的类和类加载器,垃圾收集此时会触发。为了控制这种垃圾收集的频率和延迟,合适的监控和调整Metaspace非常有必要。过于频繁的Metaspace垃圾收集是类和类加载器发生内存泄露的征兆,同时也说明你的应用程序内存大小不合适,需要调整。

总结

文章看起来是杂乱无章的,我看上去也是这样的。将就着看吧。
简单来说就是Java 8里面现在使用本地化的内存存放类的元数据。

参考资料

联系方式

  • 小伙伴群:J2EE技术交流

打赏

转载请注明:懒人屋 » Java 8中JVM的变化

喜欢 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址