竹笋

注册

 

发新话题 回复该主题

jvm相关知识经验细谈 [复制链接]

1#
北京手足癣医院专家 https://m-mip.39.net/baidianfeng/mipso_8604561.html

1.jvm是什么

JVM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

2.jvm主要包含什么

jvm主要包含了堆区、方法区、栈区。堆区主要存储对象、数组、成员变量。

方法区主要执行成员对象方法和静态方法。

Java堆(Heap)

是Java虚拟机所管理的内存中最大的一块,在虚拟机启动时创建。

线程共享,此内存区域的唯一目的就是存放对象实例。

方法区(MethodArea)

线程共享,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

程序计数器(ProgramCounterRegister)线程私有,是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。

JVM栈(JVMStacks)

线程私有,生命周期与线程相同。

虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(StackFrame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。本地方法栈(NativeMethodStacks)

线程私有,与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。

PS:NativeMethod就是一个java调用非java代码的接口3.jvm对象分配原则对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次MinorGC。

大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。

这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。

长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1次MinorGC(年轻代收集)那么对象会进入Survivor区,之后每经过一次MinorGC那么对象的年龄加1,知道达到阀值对象进入老年区。

动态判断对象的年龄。

如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代。空间分配担保。

每次进行MinorGC时,JVM会计算Survivor区移至老年区的对象的平均大小,如果这个值大于老年区的剩余值大小则进行一次FullGC,如果小于检查HandlePromotionFailure设置,如果true则只进行MonitorGC,如果false则进行FullGC。

YoungGeneration(新生代):

分为:Eden区和Survivor区,Survivor区有分为大小相等的FromSpace和ToSpace。

OldGeneration(老年代):

Tenured区,当Tenured区空间不够时,JVM会在Tenured区进行majorcollection。

MinorGC:新生代GC,指发生在新生代的垃圾收集动作,因为java对象大多都具备朝生夕死的特性,所以MinorGC非常频繁,一般回收速度也比较快。

MajorGC:发生老年代的GC,对整个堆进行GC。出现MajorGC,经常会伴随至少一次MinorGC(非绝对)。

MajorGC的速度一般比minorGC慢10倍以上。FullGC:整个虚拟机,包括永久区、新生区和老年区的回收。

4.垃圾回收机制空间分配原则:

old区、yong区、s0、s1区。

old区存活时间比较久的对象。

yong区新创建的对象。

s0和s1是yoong的缓冲区。

标记-清除算法:适合old区

标记-复制算法:适合yong区的存活对象较少的时候。

5.jvm调优

增大内存。

减少gc执行时间。

优化gc空间碎片减少g1的调用频率。

分享 转发
TOP
发新话题 回复该主题