如何理解JAVAJVM
如何理解JAVA JVM,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
创新互联建站始终坚持【策划先行,效果至上】的经营理念,通过多达10年累计超上千家客户的网站建设总结了一套系统有效的网络营销推广解决方案,现已广泛运用于各行各业的客户,其中包括:成都发电机维修等企业,备受客户好评。
什么是JVM
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
市面上是有很多虚拟机
了解JVM的结构,通过合理的参数配置,有助于我们更好的发挥JVM的性能。
内存结构
内存空间的主要组成
方法区
方法区(Method Area),是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据
堆
对于Java应用程序来说,Java堆(Java Heap)是虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,Java世界里“几乎”所有的对象实例都在这里分配内存
虚拟机栈
线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程
本地方法栈
本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务
程序计数器
程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。可以理解为标记程序下一行执行什么。
方法区,堆,线程共享
虚拟机栈,本地方法栈,程序计数器,线程私有,创建一个线程时(可以理解为运行一个方法),创建一个栈帧,专门服务与此线程
内存分配
堆内存是我们主要使用的内存,堆内存组成如下
包括,年轻代,老年代(默认比例是 1:2)
年轻代:
1.1 包含一个Eden,二个Survivor(默认比例 8:1:1),年轻代用于保存新创建的对象,如果年轻代的内存不够,会进行一次MinorGC,如果经历15次MinorGC(默认值),还存活的,会被转移到老年代(如果新对象年轻代,放不下,会被直接放到老年代)
1.2 年轻代使用复制算法,把内存区域分为两块(Eden+Survivor,另一个Survivor),每次使用一块,GC的时候把一块中的内容移动到另一块中,原始内存中的对象就可以被回收了
老年代:
2.1 老年代内存不够时,会进行一次MajorGC(也有说法是FullGC)
因为GC会造成"Stop the world",线程暂停,所以要合理调整堆内存大小,并分配年轻代,老年代的比例,以达到减少GC频率,降低GC时间的目的
垃圾回收
在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(“死去”即不可能再被任何途径使用的对象)了。
一般采用“引用计数算法”来判定引用
内存优化调整
总结以上,内存调优的目的是,提高代码的执行效率,减少GC频率,降低GC时间,这就需要合理的分配堆内存(堆的总大小,年轻代的大小)
下载安装工具 使用工具:JDK Mission Control 简称JMC
下载安装参考 https://www.cnblogs.com/jhxxb/p/13279286.html
本地程序可以直接在工具中看到,也可以远程连接到JVM,一般在服务器生成飞行数据,下载到本地,再用工具打开
启动程序
一般先设置JVM参数,运行程序(-Xms1024m -Xmx1024m -Xmn512m)
Xms: 初始堆大小,默认无聊内存的1/64
Xmx: 最大堆大小,默认物理内存的1/4
Xmn: 新生代大小(新建对象,建议堆的25%-50%),默认整个堆的1/3
收集程序的飞行数据
jcmd
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的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!
文章名称:如何理解JAVAJVM
链接地址:http://pwwzsj.com/article/peeejp.html