温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何理解JAVA JVM

发布时间:2021-11-23 10:37:04 来源:亿速云 阅读:122 作者:柒染 栏目:大数据

如何理解JAVA JVM,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

什么是JVM

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

市面上是有很多虚拟机

了解JVM的结构,通过合理的参数配置,有助于我们更好的发挥JVM的性能。

内存结构

如何理解JAVA JVM

内存空间的主要组成

如何理解JAVA JVM

  1. 方法区

    方法区(Method Area),是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据

  2. 对于Java应用程序来说,Java堆(Java Heap)是虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,Java世界里“几乎”所有的对象实例都在这里分配内存

  3. 虚拟机栈

    线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程

  4. 本地方法栈

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

  5. 程序计数器

    程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。可以理解为标记程序下一行执行什么。

方法区,堆,线程共享

虚拟机栈,本地方法栈,程序计数器,线程私有,创建一个线程时(可以理解为运行一个方法),创建一个栈帧,专门服务与此线程

内存分配

堆内存是我们主要使用的内存,堆内存组成如下

如何理解JAVA JVM

包括,年轻代,老年代(默认比例是 1:2)

  1. 年轻代:

1.1 包含一个Eden,二个Survivor(默认比例 8:1:1),年轻代用于保存新创建的对象,如果年轻代的内存不够,会进行一次MinorGC,如果经历15次MinorGC(默认值),还存活的,会被转移到老年代(如果新对象年轻代,放不下,会被直接放到老年代)

1.2 年轻代使用复制算法,把内存区域分为两块(Eden+Survivor,另一个Survivor),每次使用一块,GC的时候把一块中的内容移动到另一块中,原始内存中的对象就可以被回收了

  1. 老年代:

2.1 老年代内存不够时,会进行一次MajorGC(也有说法是FullGC)

因为GC会造成"Stop the world",线程暂停,所以要合理调整堆内存大小,并分配年轻代,老年代的比例,以达到减少GC频率,降低GC时间的目的

垃圾回收

在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(“死去”即不可能再被任何途径使用的对象)了。

一般采用“引用计数算法”来判定引用

内存优化调整

总结以上,内存调优的目的是,提高代码的执行效率,减少GC频率,降低GC时间,这就需要合理的分配堆内存(堆的总大小,年轻代的大小)

  1. 下载安装工具 使用工具:JDK Mission Control 简称JMC

下载安装参考 https://www.cnblogs.com/jhxxb/p/13279286.html

本地程序可以直接在工具中看到,也可以远程连接到JVM,一般在服务器生成飞行数据,下载到本地,再用工具打开

  1. 启动程序

一般先设置JVM参数,运行程序(-Xms1024m -Xmx1024m -Xmn512m)

Xms: 初始堆大小,默认无聊内存的1/64

Xmx: 最大堆大小,默认物理内存的1/4

Xmn: 新生代大小(新建对象,建议堆的25%-50%),默认整个堆的1/3

  1. 收集程序的飞行数据

    jcmd <pid> JFR.start delay=10s duration=15m filename=log.jfr

    说明: pid: 服务的进程号. 使用ps -ef | grep java 查询. (使用时去除尖括号)

    delay: 延迟开启配置. delay=10s 代表延迟10秒开启.

    duration: 指收集的日志时长. duration=15m, 代表收集15分钟的JVM信息.

    filename: 指将收集的日志存在指定的日志文件中. filename=log.jfr, 代表将收集的日志存放在log.jfr中.

看完上述内容,你们掌握如何理解JAVA JVM的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI