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. redis部署问题

    在部署redis哨兵的时候,一开始一直都是失败:杀死master进程后,没有选出新的master 日志如下 9985:X 18 Feb 20:14:42.409 # +sdown master mym ...

  2. Spring Boot学习(一)初识Spring Boot

    Spring Boot 概述 Spring Boot 是所有基于 Spring 开发的项目的起点.Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置 ...

  3. Kafka监控必备——Kafka-Eagle 2.0.2正式发布

    对于经常使用Kafka的同学,拥有一个炫酷又实用的监控系统是非常有必要的.可以实时的监控数据流的情况,了解实时数据流的变化. Kafka Eagle Kafka Eagle是一个监控系统,监控Kafk ...

  4. Python-求序列长度和序列长度协议-len() __len__

    len() 求序列的长度 print(len("beimenchuixue")) print(len([1, 2, 3])) __len__ 对象中实现这个方法,则 len() 方 ...

  5. Centos-移动文件或目录-mv

    mv 移动文件或者目录,可以用重命名文件或者目录 相关选项 -i 如果文件或目录存在询问是否覆盖,输入y确认,输入n取消 -f 不提示,覆盖

  6. C++里的程序 GetDlgItem(IDC_EDIT_INPUTFILE) ->EnableWindow(TRUE)

    转载:https://zhidao.baidu.com/question/654519209423407765.html GetDlgItem(IDC_EDIT_INPUTFILE) ->Ena ...

  7. C语言中 malloc

    参考:https://blog.csdn.net/kokodudu/article/details/11760863 一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: ...

  8. 「DevOps 转型与实践」沙龙回顾第二讲

    背景介绍 本期分享内容为<平台化 DevOps-云计算与云原生模式下 DevOps 的建设实践>.目前,DevOps 越来越成为大家当前建设的热点,伴随着基础设施的转型和应用框架的转型,更 ...

  9. LiteOS-任务篇-源码分析-删除任务函数

    目录 前言 笔录草稿 源码分析 LOS_TaskDelete函数源码分析 完整源码 参考 链接 前言 20201009 LiteOS 2018 需要会通用链表 笔录草稿 源码分析 LOS_TaskDe ...

  10. RHSA-2018:3665-重要: NetworkManager 安全更新

    [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...