快速了解Java虚拟机(JVM),看这儿就够了

举报
百思不得小赵 发表于 2022/05/20 13:34:26 2022/05/20
【摘要】 一、JVM相关概念汇总JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行...

一、JVM相关概念汇总

在这里插入图片描述

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

1、JVM内存图

在这里插入图片描述

2、JVM类加载器

在类加载阶段,通过一个类的全限定名来获取描述该类的二进制字节流的这个动作的“代码”被称为“类加载器”(Class Loader),这个动作是可以自定义实现的。

类加载器也是一段程序,一段代码,代码可能是c或c++、Java所编写,主要是读取磁盘下或jar包中的Class文件,装载到jvm中

  • 虚拟机自带的类加载器
  • 启动类加载器(rt.jar) 根加载器 C++实现的
  • 扩展类加载器 (扩展的类)extends ClassLoader
  • 应用程序加载器(自己写的类) extends ClassLoader

3、双亲委派模型

如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。
每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中。只有当上一层类加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到这个类)时,下一层类加载器才会尝试自己去加载。

三个加载器都加载不到就会抛出 ClassNotFund异常

JDK设计双亲委派模型的好处:

  • ​ 确保安全,避免核心类库被修改
  • ​ 避免重复加载
  • ​ 保证类的唯一性。

双亲委派模型可以被打破,需要自定义类加载器,继承ClassLoader类,重写LoadClass方法。

在这里插入图片描述

native:
使用native关键字时,会去调用底层的c语言的库
进入本地方法栈,调用本地方法的本地接口 JIN
JIN作用:扩展java的使用,融合不同的语言为java所有

方法区主要存放:静态变量,常量,类信息,常量池。

4、堆

一个JVM只有一个堆内存,堆内存大小可以调节。

类加载器读取了类文件会把,类,方法,常量,变量,保存所有引用类型的真实对象。

堆内存主要分为三个区域:新生区(伊甸园)、老年区、永久区。

堆、元空间(方法区)是线程共享的;其他区域是线程私有的

在这里插入图片描述

特点及作用:

1、线程共享的一块区域;

2、虚拟机启动时创建;

3、虚拟机所管理的内存中最大的一块区域;

4、存放所有实例对象或数组;

5、GC垃圾收集器的主要管理区域;

6、可分为新生代、老年代;

7、新生代更细化可分为Eden、
From Survivor、To Survivor,Eden:Survivor = 8:1:1

8、可通过-Xmx、-Xms调节堆大小;

9、无法再扩展

java.lang.OutOfMemoryError: Java heap space

GC垃圾回收机制:主要回收新生区和老年区

堆内存满,抛出,OOM错误。 JDK8之前叫永久存储区,JDK8之后叫元空间。 逻辑上存在,物理上不存在

新生区:

  • ​ 类诞生和成长,直到死亡的地方
  • ​ 所有的对象都在伊甸园区new出来

老年代:
·当新生代经历15次轻GC后还存在引用的,则被转移到老年代

永久区:

​ 永久区常驻内存,用来存放JDK自身携带的Class对象,interface元数据,存储的是Java运行的一些环境,这个区域不存在垃圾回收。关闭虚拟机时,释放这个区域的内存。

OOM:

​ -Xms:设置初始化分配内存大小 1/64 -Xmx:设置最大分配内存1/4

​ -XX:+PrintGCDetails GC清理垃圾信息 -XX:+HeapDumpOnOutOfMemoryError dumpOOM错误文件

​ 尝试扩大内存空间看结果,如果还有错误,分析代码是否出现垃圾代码或者死循环。

​ 内存快照分析工具,MAT,Jprofiler 作用:

①分析Dump内存文件,快速定位内存泄漏 ②获得堆中数据 ③获得最大对象

5、GC

作用区域:堆(堆+方法区(非堆)))

GC两种类型:轻GC 针对新生代和偶尔的幸存区(from,to) 重GC(全局GC)

GC的算法:标记清除法 不需要额外内存空间,两次扫描,浪费时间,产生内存碎片 、标记压缩,复制算法(新生代、伊甸园区 )伊甸园区和to区为空,引用计数器

GC算法总结:

内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)

内存整齐度:复制算法=标记压缩算法>标记清除

内存利用率:标记压缩算法=标记清除>复制算法

新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?

  • 新生代回收器:Serial、ParNew、Parallel Scavenge
  • 老年代回收器:Serial Old、Parallel Old、CMS
  • 整堆回收器:G1

新生代垃圾回收器一般采用的是复制算法,复制算法的优点是效率高,缺点是内存利用率低;老年代回收器一般采用的是标记-整理的算法进行垃圾回收。

6、栈

特点及其作用:

1、线程私有;

2、方法执行会创建栈帧,存储局部变量表等信息;

3、方法执行入虚拟机栈,方法执行完出虚拟机栈;(先进后出)

4、栈深度大于虚拟机所允许StackOverflowError;

5、栈需扩展而无法申请空间OutOfMemoryError(比较少见);hotspot虚拟机没有;

6、栈里面运行方法,存放方法的局部变量名,变量名所指向的值(常量值、对象值等)都存放到堆上的;

7、栈一般都不设置大小,栈所占的空间其实很小,可以通过-Xss1M进行设置,如果不设置默认为1M;

8、随线程而生,随线程而灭;

9、该区域不会有GC回收。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。