jvm介绍及其优化

JVM是什么

  JVM是Java Virtual Machine(Java虚拟机)的缩写,主要是通过在实际计算机模仿各种计算机功能来实现的,组成部分包括堆、方法区、栈、本地方法栈、程序计算器等部分组成的,其中方法回收堆和方法区是共享区,也就是谁都可以使用,而栈和程序计算器、本地方法栈区是归JVM的。Java能够被称为“一次编译,到处运行”的原因就是Java屏蔽了很多的操作系统平台相关信息,使得Java只需要生成在JVM虚拟机运行的目标代码也就是所说的字节码,就可以在多种平台运行。

JVM架构图

         图片来源于https://www.sohu.com/a/136620820_355123

JRE、JVM、JDK之间关系

  JDK是Java程序员常用的开发包、目的就是用来编译和调试Java程序的。JRE是指Java运行环境,也就是我们的写好的程序必须在JRE才能够运行。JVM是Java虚拟机的缩写,是指负责将字节码解释成为特定的机器码进行运行,值得注意的是在运行过程中,Java源程序需要通过编译器编译为.class文件,否则JVM不认识。

一. JVM优化一:优化之压缩普通对象指针(CompressedOops)

  我知道通常在64位机器上JVM消耗的内存会比32位的大,这是因为对象指针在64位架构下,长度会翻倍(更宽的寻址)。对于那些将要从32位平台移植到64位的应用来说,平白无辜多了1/2的内存占用,这是开发者不愿意看到的。

  在jdk1.6之后提供了普通对象指针压缩功能-XX:+UseCompressedOops以节省内存消耗。

   启用CompressOops后,会压缩的对象:
    1. 每个Class的属性指针(静态成员变量)。
    2. 每个对象的属性指针。
    3. 普通对象数组的每个元素指针。

Java 逃逸分析

  Java 创建的对象都是被分配到堆内存上,但是事实并不是这么绝对,通过对Java对象分配的过程分析,可以知道有两个地方会导致Java中创建出来的对象并一定分别在所认为的堆上。这两个点分别是Java中的逃逸分析和TLAB(Thread Local Allocation Buffer)线程私有的缓存区。

  逃逸分析,是一种可以有效减少Java程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。通过逃逸分析,Java Hotspot编译器能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上。

原文地址:https://www.cnblogs.com/songgj/p/10966136.html