Android Java JVM常见问答分析与总结

一、JVM是什么

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

JVM的重要性

JVM这块是一个偏向于概念模块,但是在好多大企业都是会比较看中的一块,只有了解了JVM,在开发过程中才能更好的发挥项目的性能,提升项目质量。以下是我整理了一些有关JVM的资料,供大家参考。

二、JVM常见问题

1.JVM的主要组成部分

1.class loader 类加载器:加载类文件到内存。Class loader只管加载

2.exection engine :执行引擎也叫解释器,负责解释命令,交由操作系统执行

3.native interface:本地接口。本地接口的作用是融合不同的语言为java所用

4.Runtimedata area 运行数据区:运行数据区是jvm的重点,我们所有所写的程序都被加载到这里,之后才开始运行

5.stack栈:栈也叫栈内存,是java程序的运行区,是在线程创建时创建,它的生命周期跟随线程的生命周期,线程结束栈内存释放

6.堆内存:一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。类的加载器读取了类文件之后,需要把类、方法、常变量放到堆内存中,以方便执行器执行,堆内存分三部分

7.方法区:方法去是被所有线程共享,

8.程序计数器:每个线程都有一个程序计数器,就是一个指针,指向方法区中的方法字节码,由执行引擎读取下一条指令

2、JVM运行时数据区

Java 虚拟机规范规定的区域分为以下 5 个部分

1.程序计数器:当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令

2.虚拟栈:用于存储局部变量表、操作数栈、动态链接、方法出口等信息,Java方法;

3.本地栈:而本地方法栈是为虚拟机调用 Native 方法服务的

4.堆:Java 虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存

5.方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据

3.类装载(classload)的执行过程

类装载分为以下 5 个步骤

1.加载:根据查找路径找到相应的 class 文件然后导入;

2.检查:检查加载的 class 文件的正确性;

3.准备:给类中的静态变量分配内存空间;

4.解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而在直接引用直接指向内存中的地址;

5.初始化:对静态变量和静态代码块执行初始化工作。

4.判断对象是否可以被回收

1.引用计数器:为每个对象创建一个引用计数,有对象引用时计数器 +1,引用被释放时计数 -1

2.可达性分析:从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链

5.Java中都有哪些引用类型

1.强引用:发生 gc 的时候不会被回收。

2.软引用:有用但不是必须的对象,在发生内存溢出之前会被回收。

3.弱引用:有用但不是必须的对象,在下一次GC时会被回收。

4.虚引用(幽灵引用/幻影引用):虚引用的用途是在 gc 时返回一个通知

6、简述分代垃圾回收器是怎么工作

分代回收器有两个分区:老生代和新生代,新生代默认的空间占比总空间的 1/3,老生代的默认占比是 2/3。

7.JVM调优的工具

JDK 自带了很多监控工具,都位于 JDK 的 bin 目录下,其中最常用的是 jconsole 和 jvisualvm 这两款视图监控工具。

8.常用的JVM调优的参数都有哪些

XX比X的稳定性更差,并且版本更新不会进行通知和说明。

-Xms s为strating,表示堆内存起始大小

-Xmx x为max,表示最大的堆内存

(一般来说-Xms和-Xmx的设置为相同大小,因为当heap自动扩容时,会发生内存抖动,影响程序的稳定性)

-Xmnn为new,表示新生代大小

(-Xss:规定了每个线程虚拟机栈(堆栈)的大小)

-XX:SurvivorRator=8表示堆内存中新生代、老年代和永久代的比为8:1:1

-XX:PretenureSizeThreshold=3145728(创建大小)表示当创建(new)的对象大于3M的时候直接进入老年代

-XX:MaxTenuringThreshold=15表示当对象的存活的年龄(minor gc一次加1)大于多少时,进入老年代

-XX:-DisableExplicirGC表示是否(+表示是,-表示否)打开GC日志

9.获取Java程序使用的内存?堆使用的百分比

可以通过 java.lang.Runtime 类中与内存相关方法来获取剩余的内存,总内存及 最大堆内存。

10.JRE、JDK、JVM 及JIT之间有什么不同

JRE: 代表 Java 运行时(Java run-time),是运行 Java 引用所必须的。

JDK:代表 Java 开发工具(Java development kit),是 Java 程序的开发工具

JVM :代表 Java 虚拟机(Java virtual machine),它 的责任是运行 Java 应用。

11.说一下JVM有哪些垃圾回收算法

标记-清除算法:标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片。

标记-整理算法:标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。

复制算法:按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存使用率不高,只有原来的一半。

分代算法:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法。

12.什么是双亲委派模型

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

13.JVM生命周期

在如下几种情况下,Java虚拟机将结束生命周期

1、执行了System.exit()方法

2、程序正常执行结束

3、程序在执行过程中遇到了异常或错误而终止进程

4、由于操作系统出现错误而导致Java虚拟机进程终止

相关推荐
一只努力的微服务3 分钟前
【Calcite 系列】将 INTERSECT 转换为 EXISTS
java·calcite
向往着的青绿色3 分钟前
编程式事务,更加精细化的控制
java·开发语言·数据库·spring·性能优化·个人开发·设计规范
ホロHoro14 分钟前
数据结构非线性部分(1)
java·数据结构·算法
沉下去,苦磨练!27 分钟前
实现二维数组反转
java·数据结构·算法
桦说编程34 分钟前
实现一个简单的并发度控制执行器
java·后端·性能优化
Spring AI学习43 分钟前
Spring AI深度解析(11/50):异常处理与容错机制实战
java·人工智能·spring
qq_12498707531 小时前
基于协同过滤算法的在线教育资源推荐平台的设计与实现(源码+论文+部署+安装)
java·大数据·人工智能·spring boot·spring·毕业设计
总是学不会.1 小时前
[特殊字符] 自动分区管理系统实践:让大型表维护更轻松
java·后端·数据库开发·开发
大筒木老辈子1 小时前
C++笔记---并发支持库(future)
java·c++·笔记
全靠bug跑1 小时前
Sentinel 服务保护实战:限流、隔离与熔断降级详解
java·sentinel