安阳网站建设推广优化,网站地图用法,整合营销推广,河北廊坊公布新增阳性人员轨迹一、初识JVM#xff08;虚拟机#xff09; JVM是Java Virtual Machine#xff08;Java虚拟机#xff09;的缩写#xff0c;JVM是一种用于计算设备的规范#xff0c;它是一个虚构出来的计算机#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Jav…一、初识JVM虚拟机 JVM是Java Virtual MachineJava虚拟机的缩写JVM是一种用于计算设备的规范它是一个虚构出来的计算机是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Java语言虚拟机后Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码字节码就可以在多种平台上不加修改地运行。 二、Java为什么是“平台无关的编程语言”
Java虚拟机是一个可以执行Java字节码的虚拟机进程。
Java源文件被编译成能被Java虚拟机执行的字节码文件(.class文件)。
Java被设计成允许应用程序可以运行在任意的平台而不需要程序员为每一个平台单独重写或者是重新编译。
Java虚拟机让这个变为可能因为它知道底层硬件平台的指令长度和其他特性。
三、Java内存结构 线程共享方法区、堆
线程私有java栈、本地方法栈、程序计数器
Java堆Heap 是Java虚拟机所管理的内存中最大的一块在虚拟机启动时创建。线程共享此内存区域的唯一目的就是存放对象实例。 方法区Method Area 线程共享它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 程序计数器Program Counter Register 线程私有是一块较小的内存空间它的作用可以看做是当前线程所执行的字节码的行号指示器。 JVM栈JVM Stacks 线程私有生命周期与线程相同。 虚拟机栈描述的是Java方法执行的内存模型每个方法被执行的时候都会同时创建一个栈帧Stack Frame用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。 本地方法栈Native Method Stacks 线程私有与虚拟机栈所发挥的作用是非常相似的其区别不过是虚拟机栈为虚拟机执行Java方法也就是字节码服务而本地方法栈则是为虚拟机使用到的Native方法服务。 PS: Native Method就是一个java调用非java代码的接口 简要概括
堆【线程共享】 对象实例
方法区【线程共享】 类信息、常量、静态变量、编译后的代码
栈 局部变量、操作栈、动态链接、方法出口
程序计数器 字节码的行号指示器
本地方法栈 JVM使用到的native方法服务java调用非java代码的接口
四、JVM的对象分配规则
对象优先分配在Eden区【使用空间】如果Eden区没有足够的空间时虚拟机执行一次Minor GC【垃圾回收】。
大对象直接进入老年代大对象是指需要大量连续内存空间的对象。这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝新生代采用复制算法收集内存。
长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器如果对象经过了1次Minor GC年轻代收集那么对象会进入Survivor区之后每经过一次Minor GC那么对象的年龄加1直到达到阀值对象进入老年区。
动态判断对象的年龄。如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半年龄大于或等于该年龄的对象可以直接进入老年代。
空间分配担保。每次进行Minor GC时JVM会计算Survivor区移至老年区的对象的平均大小如果这个值大于老年区的剩余值大小则进行一次Full GC如果小于检查HandlePromotionFailure设置如果true则只进行Monitor GC,如果false则进行Full GC。
简要概括如下
对象先在Eden区Eden区空间不够时进行新生代GC
大对象和长期存活的对象进入老年代
JVM为每个对象设置了计数器经过1次新生代GC则进入幸存者区达到年龄阈值则进入老年区
幸存者区中年龄一致的对象所占内存大小大于幸存者区空间一半时则大于等于此年龄的对象全部进入老年代
老年代GC通常伴随着一次新生代GC但不绝对
术语说明
Young Generation新生代分为Eden区和Survivor区Survivor区有分为大小相等的From Space和To Space。
Old Generation老年代 Tenured区当 Tenured区空间不够时 JVM 会在Tenured区进行 major collection。
Minor GC新生代GC指发生在新生代的垃圾收集动作因为java对象大多都具备朝生夕死的特性所以Minor GC非常频繁一般回收速度也比较快。
Major GC发生老年代的GC对整个堆进行GC。出现Major GC经常会伴随至少一次Minor GC非绝对。MajorGC的速度一般比minor GC慢10倍以上。
Full GC整个虚拟机包括永久区、新生区和老年区的回收。