LHon(学习笔记篇)——JVM

新司机上路,如文中内容有误,还请各位前辈能够指正,谢谢各位!!

JDK与JRE

JDK即 Java Development Kit ,Java开发工具;JRE即 Java Runtime Environment ,Java运行时环境。
在这里插入图片描述

类装载子系统

我们所写的.java文件经过javac命令编译之后生成.class文件(生成在硬盘上),JVM便会通过类装载子系统去运行这些.class文件(java命令)。

  • class文件:编译生成在硬盘上;
  • class content:类加载器将class文件加到到系统里面的一块内存;
  • class对象:类加载器解析class content里面的内容所生成的class对象,放在方法区(元空间);

java虚拟机(java virtual machine, JVM)是一种能够运行java字节码的虚拟机,它从软件层面上屏蔽不同操作系统在底层硬件与指令上的区别,生成不同操作系统能够运行的机器码,这也是Java的一大特点:平台无关性。它由类加载子系统、运行时数据区(内存结构)、执行引擎三部分组成。
JVM结构图如下:
在这里插入图片描述

字节码执行引擎

执行字节码指令,可以动态修改程序计数器的值,它还会触发gc线程。

运行时数据区

方法区
存放常量、静态变量、类元信息(class对象的信息)。生成的class对象存放在方法区,方法区有永久代和元空间之分,JDK8及以后,永久代被废除,方法区相当于是一个规范,永久代和元空间是该规范的一个实现。

  • 永久代:存在堆中,最小为20M,最大可以看作是无限大,一般设置最小等于最大,防止内存抖动;
  • 元空间:内容存放到直接内存中。


堆和方法区是线程共享的,用来存放对象信息。同一个类,new出来的对象会指向方法区中的同一个类元信息。

虚拟机栈(线程栈)
Java代码运行的需要,它是线程私有的,其生命周期与线程相同,默认大小为1024k,可以调节, 其中有很多对象的引用(存放在局部变量表中)会指向堆中的对象信息。

栈帧
栈帧由局部变量表、操作数栈、动态链接、方法出口、附加信息组成,它是虚拟机栈的基本元素,每一次方法的调用到返回过程都是一个栈帧进栈出栈的过程,遵循先进后出原则,最顶部的栈帧称为当前栈帧。

  • 局部变量表:存放形参和局部变量,若局部变量为对象,则会存放对该对象的引用,new出来的对象一般都存放在堆中,它的大小在编译期就确定了;
  • 操作数栈:临时存放需要用的操作数,如a = 1,会先将1放入操作数栈,然后弹出放到局部变量表的a中;
  • 方法出口:进入某个方法时,会保存该方法的下一行代码的地址(也就是指令码对应的执行地址),在方法执行完之后,会根据这个地址返回到相应位置。

程序计数器
每一个线程都拥有一个程序计数器,如果线程正在执行一个方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。

本地方法栈
native修饰的方法,当JVM执行到这种方法是,会调用C语言的函数库,找到对应的方法。本地方法栈、程序计数器、线程栈是线程私有的。

JVM调优思路

这里先来看一下运行时数据区中堆的详细结构:
在这里插入图片描述
其中老年代会占所有内存的2/3,剩下的1/3由Eden(伊甸园)区和Survivor区分配,如上图。
垃圾收集的过程

当Eden区存放的对象越来越多时,会导致该区被装满,这个时候JVM便会触发minor gc(也可以叫young gc ,由字节码执行引擎触发的垃圾收集线程)来清理无效的、无引用的对象,这之后,未被清理的对象会转移到From区;在第2次Eden区装满时,又会对Eden区和From区做minor gc,这之后,未被清理的对象会转移到To区;再下次,会对Eden区和To区做minor gc,未被清理的对象都会转移到From区…以此循环。当一个对象经历过15次(默认)gc之后还未被释放,当此次gc结束之后,该对象会被转移到老年代。当老年代被装满后,会触发full gc,会对所有区域的无效对象进行清理。当老年代装满,并且full gc无法清理任何对象,会抛出OOM(OutOfMemoryError)异常。

  • 无效的、无引用的对象:指栈帧执行结束后(已经出栈),JVM还未结束,这个时候栈帧的局部变量表中存放的引用会失效,使得堆中的对象没有任何引用指向它,这种对象可以称为无效对象。
  • 对象分代年龄:对象每经历一次gc,其年龄会+1。
  • JVM调优思路:要尽量减少full gc的次数以及每次full gc的执行时间(在gc时,除垃圾收集线程以外的线程都将被停止,造成系统卡顿。minor gc执行时间较短,可以不作考虑,而full gc的执行时间比较长)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值