前言:Java虚拟机的重要性不言而喻,不管是在实际工作中,还是面试中。


1.JVM架构

要点:

主要了解Java虚拟机运行时数据区:程序计数器、Java虚拟机栈、本地方法栈、Java堆和方法区。

参考:

https://blog.csdn.net/seu_calvin/article/details/51404589

http://www.cnblogs.com/smyhvae/p/4748392.htm

2.新生代、老年代

在JVM中,堆是被JVM所管理的最大一块内存空间,主要用于存放各种类的实例对象。

堆一般分为:新生代、老年代。

新生代:主要是用来存放新生的对象。一般占据堆的1/3空间。由于频繁创建对象,所以新生代会频繁触发MinorGC进行垃圾回收。

新生代又分为 Eden区、SurvivorFrom、SurvivorTo三个区。

Eden区:Java新对象的出生地(如果新创建的对象占用内存很大,则直接分配到老年代)。当Eden区内存不够的时候就会触发MinorGC,对新生代区进行一次垃圾回收。

SurvivorTo:保留了一次MinorGC过程中的幸存者。

SurvivorFrom:上一次GC的幸存者,作为这一次GC的被扫描者。

MinorGC的过程:MinorGC采用复制算法。首先,把Eden和SurvivorFrom区域中存活的对象复制到SurvivorTo区域(如果有对象的年龄以及达到了老年的标准,则复制到老年代区),同时把这些对象的年龄+1(如果SurvivorTo不够位置了就放到老年区);然后,清空Eden和SurvivorFrom中的对象;最后,SurvivorTo和SurvivorFrom互换,原SurvivorTo成为下一次GC时的SurvivorFrom区。

老年代:主要存放应用程序中生命周期长的内存对象。

老年代的对象比较稳定,所以MajorGC不会频繁执行。在进行MajorGC前一般都先进行了一次MinorGC,使得有新生代的对象晋升入老年代,导致空间不够用时才触发。当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次MajorGC进行垃圾回收腾出空间。

MajorGC采用标记—清除算法:首先扫描一次所有老年代,标记出存活的对象,然后回收没有标记的对象。MajorGC的耗时比较长,因为要扫描再回收。MajorGC会产生内存碎片,为了减少内存损耗,我们一般需要进行合并或者标记出来方便下次直接分配。

当老年代也满了装不下的时候,就会抛出OOM(Out of Memory)异常。

关于永久代:指内存的永久保存区域,主要存放Class和Meta(元数据)的信息,Class在被加载的时候被放入永久区域。它和和存放实例的区域不同,GC不会在主程序运行期对永久区域进行清理。所以这也导致了永久代的区域会随着加载的Class的增多而膨胀,最终抛出OOM异常。

主要参考:

https://www.cnblogs.com/E-star/p/5556188.html

https://www.cnblogs.com/junwangzhe/p/6282550.html

https://www.cnblogs.com/ygj0930/p/6522828.html

3.对象的创建过程

关于Java中对象的创建过程,参考:http://www.cnblogs.com/chenyangyao/p/5296807.html

4.类加载过程

类的加载过程包括:加载、验证、准备、解析、初始化。

具体参考:

https://blog.csdn.net/u010425776/article/details/51254858

http://www.cnblogs.com/chenyangyao/p/5245669.html

http://www.cnblogs.com/xrq730/p/4844915.html

5.Class文件结构

Class的文件结构主要有9部分。

具体参考:

https://blog.csdn.net/u010425776/article/details/51245055

6.对象的内存分配原则

具体参考:

http://www.cnblogs.com/xrq730/p/4841177.html

https://blog.csdn.net/u010425776/article/details/51192448

7.对象的访问过程

具体参考:

https://www.cnblogs.com/haitaofeiyang/p/7767919.html

8.关于类加载器

要点:启动类加载器(Bootstrap ClassLoader)和其他类加载器。

具体参考:

http://www.cnblogs.com/xrq730/p/4845144.html

9.类的加载时机

通过了解类的加载时机,就可以了解类的初始化过程了。

具体参考:

https://blog.csdn.net/u010425776/article/details/51251430

10.JVM垃圾收集策略

具体参考:

http://www.cnblogs.com/xrq730/p/4836700.html

https://blog.csdn.net/u010425776/article/details/51189318


by Shawn Chen,2018.4.6日,中午。

Java面试知识点之虚拟机篇(一)的更多相关文章

  1. Java面试知识点之线程篇(三)

    前言:这里继续对java线程相关知识点进行总结,不能间断. 1.yield()方法 yield()的作用是让步.它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执 ...

  2. Java面试知识点之线程篇(二)

    前言:接上篇,这里继续对java线程相关知识点进行总结. 1.notify和notifyall的区别 notify()方法能够唤醒一个正在等待该对象的monitor的线程,当有多个线程都在等待该对象的 ...

  3. Java面试知识点之线程篇(一)

    前言:在Java面试中,一定会遇到线程相关问题,因此笔者在这里总结Java中有关线程方面知识点,多数从网上得来(文中会贴出主要参考链接),有些也是笔者在面试中所遇到的问题,如有错误,请不吝指正.主要参 ...

  4. Java面试知识点之计算机网络篇(一)

    前言:在Java面试中,计算机网络的知识也是一项重点,因此笔者在此对计算机网络的相关知识进行总结. 1.OSI参考模型 自下而上:物理层(物理介质,比特流).数据链路层(网卡.交换机).网络层(IP协 ...

  5. Java面试知识点之数据库篇(一)

    前言:数据库的相关知识,在面试中也经常出现,笔者认为非常有必要对此类知识进行相关总结. 1.索引 索引是对数据库表中一列或多列的值进行排序的结构,是帮助数据库高效获取数据的数据结构. 通俗理解:索引就 ...

  6. Java 面试知识点解析(三)——JVM篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  7. Java 面试知识点解析(四)——版本特性篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  8. Java 面试知识点解析(二)——高并发编程篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  9. Java 面试知识点解析(五)——网络协议篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

随机推荐

  1. webAPI 控制器(Controller)太多怎么办?

    写过接口的同学都知道,接口会越来越多,那么控制器也会越来越多.这时候就需要根据某种业务或特性对controller进行分类然后建立文件夹. 我想到一个折中的方案:伪Areas! 在Areas文件夹下建 ...

  2. vs 调试 iis中的网站

    打开网站,在vs中附加进程,选择w3wp.exe,如果不能下断点,设置一下pdb文件位置

  3. [Linux] LVS虚拟服务器四层负载均衡

    随着互联网的爆炸性增长及其在我们生活中日益重要的作用,互联网上的流量急剧增加,并且每年以超过100%的速度增长.服务器上的工作负载正在迅速增加,因此服务器很容易在短时间内过载,尤其是对于流行的网站.为 ...

  4. 【Java每日一题】20170222

    20170221问题解析请点击今日问题下方的“[Java每日一题]20170222”查看(问题解析在公众号首发,公众号ID:weknow619) package Feb2017; import jav ...

  5. python面向对象学习(五)多态

    多态 多态:不同的 子类对象 调用相同的 父类方法,产生不同的执行结果 多态 可以 增加代码的灵活度 以 继承 和 重写父类方法 为前提 是调用方法的技巧,不会影响到类的内部设计 多态案例练习 需求 ...

  6. [工具配置]requirejs 多页面,多入口js文件打包总结

    需要明确以下几点: 1.本地前端调试代码肯定是调用原始的路径以及代码,但是线上运行的肯定是通过打包后的另一个路径,这儿就是生成的dist文件夹了. 2.requirejs的引入,线上跟线下的路径怎么控 ...

  7. Linux网络设备驱动的实现

    结论: 1.对一个设备驱动而言,主要从两个方面进行着手,一个是控制流,一个是数据流. 控制流就是如何控制网络设备,数据流则说的是报文的收发流程. 2.网络设备可以是Linux服务器的网卡,也可以是嵌入 ...

  8. SQL学习总结-思维导图

  9. 使用git将Android源码上传到github

    下面举Android的Browser源码通过git保存到github上 首先在github.com官网new repository一个仓库 在Repository name哪里填入Browser然后创 ...

  10. matlab练习程序(局部加权线性回归)

    通常我们使用的最小二乘都需要预先设定一个模型,然后通过最小二乘方法解出模型的系数. 而大多数情况是我们是不知道这个模型的,比如这篇博客中z=ax^2+by^2+cxy+dx+ey+f 这样的模型. 局 ...