1.JVM工作原理

2.JVM组成部分及其作用。

java虚拟机分为两个子系统和两个组件。

两个子系统分别是类加载器和执行引擎,类加载器负责加载字节码(.class)文件到JVM的内存中,执行引擎负责执行classes下面的指令,还可以修改程序计数器的值。

两个组件分别是运行时数据区和本地方法接口。

运行时数据区也就是JVM的内存,本地方法接口就是和其他语言交互的接口。

3.java应用程序运行的步骤。

首先通过IDE集成环境编写java代码,其次通过编译器将java文件编译成字节码文件,然后通过类加载器将.class文件加载到JVM内存中。(运行字节码是由解析器完成)。

4.类加载的过程。

类加载分三步。加载-连接-初始化

①加载。类加载器将.class文件加载到JVM内存中。

②连接。校验:判断.class文件的安全性和正确性。

    准备:为静态变量赋值,这个值是默认值。(为静态变量分配内存空间),如果有final修饰的变量,则赋原值。

    解析:把符号引用转换为直接引用。

③初始化。执行静态代码块,为静态变量赋值,这个值是原值。

5.JVM的类加载器。

作用:负责加载字节码文件到JVM'的内存中。

从父类加载器到子类加载器一共分为4种。分别是启动类加载器(加载核心类),扩展类加载器(加载扩展的jar),应用程序类加载器(加载classpath下面指定的内容),自定义类加载器(加载自定义的jar)。

6.双亲委派机制

为了能够让类加载器按需加载,避免重复加载,所以引入了双亲委派机制。

这个机制说白了就是一个类加载器的层次模型,一个类加载器收到了一个加载类的请求,首先他不会自己尝试去加载这个类,而是由父类加载器去加载,所以每个加载的请求都会传送到根类加载器,只有当父类反馈无法加载这个类之后,子类加载器才会尝试去加载。

使用双亲委派机制就是避免多份同样的字节码文件的加载,通过一层一层向上,看看哪一个类加载器曾经加载过这个字节码文件。

7.forname和classload的区别。

二者都是类加载的一种显示方式,forname得到的class是已经初始化的,而classload得到的class是没有进行连接的。

判断:写一个类,然后在这个类中写一段静态代码块,如果使用forname发现静态代码块被执行,使用classload发现静态代码没有被执行。

8.JVM内存模型

jvm内存模型也就是运行时数据区。

它分为方法区(元空间java8以后),java虚拟机栈,堆,程序计数器,本地方法栈。

程序计数器(线程独有):它是一块较小的内存空间,他表示字节码执行的行数,通过改变程序计数器的值来判断要执行哪一条指令,程序之间的跳转就是通过程序计数器实现的,他属于逻辑计数器。

java虚拟机栈(线程独有):是java方法执行的模型,每一次方法执行时都会创建一个栈帧,栈帧里面存放了本地变量表,操作数栈,动态链接,方法返回值。本地变量表存放本地变量,操作数栈错放临时变量值。

本地方法栈(线程独有):和java虚拟机栈类似,不过就是java虚拟机栈服务的对象是java方法,而本地方法栈为native方法服务。

方法区(线程共享)(元空间):存放一些编译器编译过后的一些代码等数据。

堆(线程共享):存放一些实例(对象),也是垃圾收集管理的区域。java堆分为年轻代和老年代。

9.JVM分代怎么工作的

jvm分为年轻代和老年代,年轻代又分为一个Eden区和两个survivor(from和to),默认比例8:1:1,。首先对象是放在Eden区和from区的,当发生GC,Eden区存活的对象就会被放到to区,然后from区的对象就会根据年龄判断去to区还是去老年代,默认年龄15。此时Eden和from为空,然后to区和from区交换。

10.java堆和栈的区别

从内存空间看:栈小于堆

从管理上看:栈自动释放,堆需要GC

从线程看:堆是线程共享的,栈是线程独有的

从分配上看:堆是动态分配,栈是静态和动态分配

从效率上看:栈大于堆

11.如何判断垃圾可以被回收

判断垃圾是否应该回收有两种方法:程序计数法,可达性分析法。

程序计数法:通过判断对象引用的次数来判断是否被回收,每个对象都会有一个引用计数器,被引用时应用技术器+1,引用完成时引用计数器-1,引用计数器为0时,就说明此对象可以视为垃圾。这种方式有一个弊端,就是假设父对象引用子对象,子对象反过来引用父对象,这样引用计数器的值永远不可能为0,会导致内存泄漏。

可达性分析法:通过判断对象的引用链来判断对象是否为垃圾。从GCroot开始寻找引用节点,然后继续寻找这个节点的引用节点,当所有引用节点寻找完毕,则剩下的节点就是没有被引用的,就可以视为垃圾。

12.什么可以被视为GC root。

java虚拟机栈中引用的对象(栈帧的本地变量表)

方法区中静态变量引用的对象

方法区中常量引用的对象

本地方法中native引用的对象

13.垃圾回收算法

标记-清除算法:在堆中从根节点进行扫描,对存活的对象进行标记,对堆从头到尾进行遍历,然后清除不可达的对象。这种算法会产生大量的垃圾碎片,不利于以后大对象的储存。

复制算法:刚开始把堆分为一个对象面和一个空闲面,首先在对象面进行对象分配,当对象面满了,就会将对象面存活的对象复制到空闲面,这样对象面就变成了空闲面,空闲面就变成了对象面。然后程序就在空闲面进行对象分配。

标记-整理算法:在堆中从根节点进行扫描,对存活的对象进行遍历,然后通过地址将存活的对象依次排序,将末节点地址以后全部清除。

分代收集算法:新生代(存活率低):复制算法

       老年代(存活率高):标记-清除算法和标记-整理算法

14.Minor GC 和 Full GC,触发Full GC的条件

Minor GC发生在年轻代,首先对象分配在伊甸园区,如果伊甸园区放不下了,也有可能直接放到survivor区。

Full GC发生在老年代。

条件:老年代空间不足:因为标记-清除算法会产生垃圾碎片,会导致老年代空间不足,就会触发Full GC

   永久代空间不足

   CMS时出现有对象进入老年代导致老年代空间不足

   调用System.gc()

15.垃圾收集器

年轻代:Serial垃圾收集器(单线程)  ParNew垃圾收集器(多线程)  Parallel Scavenge垃圾收集器(多线程可控制吞吐量)

老年代:Serial Old垃圾收集器(单线程)  Parallel Old垃圾收集器(多线程可控制吞吐量)  CMS垃圾收集器(标记-清除算法实现)

整堆回收器:G1

CMS:

16.JVM调优

工具:jconsole:对JVM线程  类等进行监控

   jvisualvm:JDK自带分析工具,分析:内存快照,程序死锁,监控内存变化,GC变化

参数:-Xms2g:初始化堆大小为2g

   -Xmx2g:堆最大为2g

   -xx:NewRatio=4:年轻代:老年代=4:1

   -xx:survivorRatio=8   Eden:survivor=8:2

.......

17.软引用和弱引用

软引用:一般维护一些可有可无的对象,内存足够的时候,软引用对象不会被回收,只有当内存不足的时候软引用对象才会被回收,如果回收之后内存依然不足,才会抛出内存溢出异常。

弱引用:更加无用,无论内存是否够用,弱引用对象都会被回收。

java面试题目之JVM(YW制作仅供参考)的更多相关文章

  1. (转)喜马拉雅2018 Java面试题目

    背景:将网上的题目整理下. java基础 1:hashTable hashMap ConcurrentHashMap 的区别.数据结构.线程安全 2:equals和==区别, 重写equals一定要重 ...

  2. jdk1.8+SpringAOP注解报java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut select错误的不知原因的解决办法[仅供参考]

    先说办法:如果Aspectweaver-1.*.*jar这三个包版本比较低, 比如1.5.0这一层次的,可以找版本高一点的包替换低版本的包,问题可以得到解决 jar包的下载地址:https://mvn ...

  3. 2019第十届蓝桥杯C++B组题解(赛后重写的,不确保答案正确性,仅供参考)

    先说一下这次的感受吧,我们考场比较乱,开始比赛了,还有的电脑有故障,(向这些人发出同情),第一次认真参加比赛,真正比赛的时候感觉没有那么正式,很乱,各种小问题,(例如博主就没找到题目在哪里,找到后又不 ...

  4. Unity上一页下一页切换功能实现源码(仅供参考)

    在做项目时我们有时需要实现切换上一页下一页图片,切换上一首下一首歌曲等等类似的功能.这里写了个简单的实现源码(仅供参考),要是有更好的方法欢迎提出来,共同进步~ 以切换上一页下一页图片为例: usin ...

  5. Ubuntu 12.04 分区方案(仅供参考)

    Ubuntu 12.04 分区方案(仅供参考)   总空间大小:50G 目录 建议大小 实际大小 格式 描述 / 10G~20G 10G ext4 根目录 swap <2048M 1G swap ...

  6. VSS的运用小内容(针对于vs2008版本)(小的问题都是,仅供参考--只针对于菜鸟级的)

    自己开始接触vss 的时候有些小的习惯没有很好的养成,下面的有关VSS内容都是简单的迁入迁出的问题,(仅供参考) 1.文件的迁入迁出:(.txt..xlsx..doc) a:文件的覆盖问题: 对于文件 ...

  7. mysql 千万级数据查询效率实践,分析 mysql查询优化实践--本文只做了一部分,仅供参考

    数据量, 1300万的表加上112万的表 注意: 本文只做了部分优化,并不全面,仅供参考, 欢迎指点.   请移步tim查看,因为写的时候在tim写的,粘贴过来截图有问题,就直接上链接了. https ...

  8. normalizr实践使用(个人总结,仅供参考)

    # normalizr实践使用 原数据 (自编数据,本数据仅供参考) var aaaObj ={ "id" : "0000000000000000000000000000 ...

  9. 第二步 (仅供参考) sencha touch 使用cmd打包apk

    最新版本的cmd可以直接将sencha touch项目打包成本地应用,不过还有很多不足,本文仅供参考 通过sencha app build native命令可以直接将项目打包成本地应用,不过在命令运行 ...

随机推荐

  1. 在自己win系统里面给idea配置Git

    这里直接是写好的步骤 下载链接

  2. 【转】Postgres SQL sort 操作性能调优

    这篇文章将以实战的方式结合笔者在项目中真实遇到的情况来讲解.说到SQL,大家可能会遇到一些写法稍微复杂的写法.比如SQL中遇到的有聚合函数sum等,也有遇到使用group by / order by的 ...

  3. web自动化(python)——selenium工具基本使用

    WebDriver基本操作 生成driver--启动浏览器 #启动谷歌浏览器,预先安装chromedrvier插件 from selenium import webdriver driver = we ...

  4. java并发编程--Synchronized的理解

    synchronized实现锁的基础:Java中每一个对象都可以作为锁,具体表现为3种形式. (1)普通同步方法,锁是当前实例对象 (2)静态同步方法,锁是当前类的Class对象 (3)同步方法块,锁 ...

  5. 玩命学JVM(一)—认识JVM和字节码文件

    本篇文章的思维导图 一.JVM的简单介绍 1.1 JVM是什么? JVM (java virtual machine),java虚拟机,是一个虚构出来的计算机,但是有自己完善的硬件结构:处理器.堆栈. ...

  6. Java面试题之计算字符/字符串出现的次数

    一.计算字符在给定字符串中出现的次数 二.计算字符串在给定字符串中出现的次数 1 import java.util.HashMap; 2 import java.util.Map; 3 4 publi ...

  7. helm部署的服务如何修改配置

    关于helm部署服务 在Kubernetes上进行容器化部署时,使用helm可以简化操作,以部署Jenkins为例,只需要以下命令即可完成部署: helm install --namespace he ...

  8. 实验1:Mininet源码安装和可视化拓扑工具

    一.实验目的 掌握 Mininet 的源码安装方法和 miniedit 可视化拓扑生成工具. 二.实验任务 使用源码安装 Mininet 的 2.3.0d6 版本,并使用可视化拓扑工具生成一个最简拓扑 ...

  9. HTML & CSS & JavaScript 从一个表格到一个灰阶颜色表 01

    工具1:HBuilder X 1.9.9.20190522 工具2:火狐浏览器 67.0.4 (64 位) 在开始之前,你需要了解一些基本的知识,不要求你能掌握,但是了解一下还是有益的: HTML 简 ...

  10. P6268 [SHOI2002]舞会

    题目描述 Link 某学校要召开一个舞会.已知学校所有 \(n\) 名学生中,有些学生曾经互相跳过舞.当然跳过舞的学生一定是一个男生和一个女生.在这个舞会上,要求被邀请的学生中的任何一对男生和女生互相 ...