VM总体分为JVM规范和JVM实现
JVM和JDK的区别
JRE = JVM+Java标准库
JDK = JRE+开发调试诊断工具
JVM具有跨平台性
JVM跨语言性:JVM只识别字节码
JVM的运行时数据区有哪些
运行时数据区的定义:Java虚拟机在执行Java程序过程中会把它所管理的内存划分为若干个不同的数据区域
什么是堆内存?堆内存包含哪些部分
堆是JVM最大的内存区域,我们申请的几乎所有对象都存储在那
堆空间为了方便GC模块进行对象分配和回收,可以把堆空间进行划分:新生代、老年代
刚创出来的对象会放在新生代,经过多次垃圾回收会放在老年代。
新创建的对象会放在Eden区,如果Eden区的空间满了,会促发垃圾回收,把对象复制到S0,下次满了,****会复制到S1,S0复制到S1。一般情况S区放不下会放在老年代,一般情况下要经过15次垃圾回收才会放在老年代
什么是内存泄露,和内存溢出有什么关系
内存泄露:本来无用的对象却继续占用内存,没有在恰当的时机释放占用的内存。
不使用的内存,却没有被释放,这个叫做内存泄露
与内存溢出的关系:
如果存在严重的内存泄露问题,随着时间的推移,必须会引起内存溢出。
Java有四种类型的垃圾回收器
1.串行垃圾回收器
2.并行垃圾回收器
3.CMS垃圾回收器
4.G1垃圾回收器
自己百度更深刻
Java8默认使用的垃圾回收器是什么
并行回收器,它是多线程的
指使用多个GC worker 线程并行地执行垃圾收集,能充分利用CPU的能力,缩短垃圾收集的暂停时间
除了单线程的GC,PS、CMS、G1都是多个线程来并行执行GC工作
G1 是垃圾优先,哪块垃圾最多就优先清理它
什么是STW?什么是安全点?什么是安全区域?
所有应用线程都需要暂停后才能执行GC,这时候就叫STW(GC暂停)。
类加载和类加载器
类加载是一个类从被加载到Java虚拟机内存开始到卸载出内存。
生命周期经历 –加载、验证、准备、解析、初始化、使用和卸载 七个阶段,其中验证、准备、解析统称为连接。
加载阶段虚拟机需要完成三件事情:
1.通过一个类的全限定名来获取定义此类的二进制字节流
2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3.在内存中生成一个代表这个类的java.lang.Class对象,作为这个方法区的所有数据的访问入口
会把第一步这个动作放在Java虚拟机外部去实现,便于程序自己决定如何获取所需的类,这个动作被称为“类加载器”
什么是双亲委派机制?有什么作用?
双亲委派机制是属于类加载的一个机制,加载之前,会委派给它的父加载器进行加载,如果父加载器不行,就自己加载。可以避免类的重复加载,保证Java核心的安全稳定
使用过哪些JVM相关的命令工具
jps 列出当前机器正在运行的虚拟机进程,jps从操作系统的临时目录去找
-q:仅显示进程
-m:输出住函数传入的参数
-l:输出应用程序住类完整的package名称或jar完整名称
-v:列出jvm参数
jstat 用于监视虚拟机各种运行状态信息的命令行工具
jstat -gc 13616 查看jvm进程13616的情况