2019独角兽企业重金招聘Python工程师标准>>>

1、java引用的四种状态

强引用、软引用、弱引用、虚引用。

强引用

new一个Object存放在堆内存,然后用一个引用指向它,这个就是强引用。

如果一个对象具有强引用,那垃圾回收器不会回收它。当内存空间不足,java虚拟机宁愿抛出outOfMemoryError错误,使程序异常终止,也不会随意回收具有强引用的对象来解决内存不足的问题。

软引用

如果一个对象只具有软引用,则内存空间足够时,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。

只要垃圾回收器没有回收它,该对象就可以被程序使用。弱引用可用来实现内存敏感的高速缓存。

弱引用

只具有弱引用的对象拥有更短暂的生命周期。

每次执行GC的时候,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

虚引用

"虚引用",形同虚设,与其他几种引用不同,虚引用并不会决定对象的生命周期,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

虚引用主要用来跟踪对象被垃圾回收器的活动。

2、java中的内存划分

2.1 程序计数器

内存空间小,线程私有。字节码解释器工作是就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完成

如果线程正在执行一个 Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是 Native 方法,这个计数器的值则为 (Undefined)。此内存区域是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域。

2.2 虚拟机栈

线程私有,生命周期和线程一致。描述的是 Java 方法执行的内存模型:每个方法在执行时都会床创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。

局部变量表:存放了编译期可知的各种基本类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型)和 returnAddress 类型(指向了一条字节码指令的地址)

StackOverflowError:线程请求的栈深度大于虚拟机所允许的深度。 OutOfMemoryError:如果虚拟机栈可以动态扩展,而扩展时无法申请到足够的内存。

2.3 本地方法栈

区别于 Java 虚拟机栈的是,Java 虚拟机栈为虚拟机执行 Java 方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。也会有 StackOverflowError 和 OutOfMemoryError 异常。

2.4 堆

对于绝大多数应用来说,这块区域是 JVM 所管理的内存中最大的一块。线程共享,主要是存放对象实例和数组。内部会划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer, TLAB)。可以位于物理上不连续的空间,但是逻辑上要连续。

OutOfMemoryError:如果堆中没有内存完成实例分配,并且堆也无法再扩展时,抛出该异常。

2.5 方法区

属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

2.6 运行时常量池

属于方法区的一部分。

属于方法区一部分,用于存放编译期生成的各种字面量和符号引用。编译器和运行期(String 的 intern() )都可以将常量放入池中。内存有限,无法申请时抛出 OutOfMemoryError。

2.7 直接内存

非虚拟机运行时数据区的部分

在 JDK 1.4 中新加入 NIO (New Input/Output) 类,引入了一种基于通道(Channel)和缓存(Buffer)的 I/O 方式,它可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用进行操作。可以避免在 Java 堆和 Native 堆中来回的数据耗时操作。 OutOfMemoryError:会受到本机内存限制,如果内存区域总和大于物理内存限制从而导致动态扩展时出现该异常。

3、java对象在内存中的状态

3.1 可达的/可触及的

从根节点扫描,只要这个对象在引用链,就是可达的。

3.2 可恢复的

java对象不再被任何变量引用就进入了可恢复状态。

在回收该对象之前,该对象的finalize()方法进行资源清理。如果在finalize()方法中重新让变量引用该对象,则对象再次变为可达状态,否则改状态进入不可达状态。

3.3 不可达的

java对象不被任何变量引用,且系统在调用对象finalize()方法后,依然没有使该对象变成可达状态,则该对象变成不可达状态。

当java对象处于不可达状态时,系统才会真正回收该对象所占有的资源。

4.判断对象死亡的两种常用算法

4.1 引用计数算法

4.2 根搜索算法

5.垃圾回收算法

5.1 标记-清除算法

算法分为标记和清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。

不足:一个是效率问题,标记和清除两个过程的效率都不高,另一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后再程序运行过程中需要分配较大的对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。 清除不是擦除,内容不会被马上清空,直到有新的的内容写入才会覆盖。

5.2 复制算法

它将可用内存按照容量划分为大小相等的两块,每次只使用其中的一块。当这块的内存用完了,就将还活着的对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可。

不足:内存浪费。

实际中我们并不需要按照1:1比例来划分内存空间,如堆内存的新生代,将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor,当另一个Survivor空间没有足够空间存放上一次新生代收集下来的存活对象时,这些对象将直接通过分配担保机制进入老年代。

5.3 标记-整理算法

让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。 主要用在老年代中

5.4 分代收集算法

存活率低:青年代采用复制算法。 存活率高:标记清理/标记整理算法

6.垃圾收集器

6.1 Serial收集器

6.2 ParNew 收集器

6.3 ParNew Scanvenge 收集器

6.4 CMS收集器

6.5 G1 收集器

7.java堆内存划分

7.1 青年代

7.2 老年代

8.类加载机制

9.初始化顺序

10.JVM参数

10.1 java对象分配与vm调优

引用

JVM常见面试题1

jvm常见面试题2

3

https://blog.csdn.net/qq_41701956/article/details/81664921

转载于:https://my.oschina.net/u/3421984/blog/3009035

Java虚拟机常见面试题相关推荐

  1. Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_3

    Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_3 总览 问题 详解 String.intern()的作用 link LeetCode的Two Sum题 ...

  2. Java基础常见面试题(一)

    Java基础常见面试题(一) 1. 为什么说 Java 语言"编译与解释并存"? 我们可以将高级编程语言按照程序的执行方式分为两种: 编译型 :编译型语言会通过编译器将源代码一次性 ...

  3. Java开发常见面试题详解(JVM)_2

    Java开发常见面试题详解(JVM)_2 JVM 问题 详解 JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots link 你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认 ...

  4. Java工程师常见面试题集锦

    Java工程师常见面试题集锦(一)互联网人必看!(附答案及视频教程,持续更新) 2019年01月02日 14:01:14 CSDNedu 阅读数:653 大牛也怕面试题,尤其是基础题,在面试中如果出现 ...

  5. java陷阱常见面试题_Java常见陷阱

    java陷阱常见面试题 总览 Java是一种极简主义的语言,具有比其他语言故意更少的功能,尽管如此,Java仍然具有产生奇怪效果的边缘情况,甚至具有令人惊讶的效果的一些常见情况也会使您轻而易举. 如果 ...

  6. Java多线程常见面试题及答案汇总1000道(春招+秋招+社招)

    Java多线程面试题以及答案整理[最新版]Java多线程高级面试题大全(2021版),发现网上很多Java多线程面试题都没有答案,所以花了很长时间搜集,本套Java多线程面试题大全,汇总了大量经典的J ...

  7. 合肥Java面试常考题_北大青鸟java 面试--常见面试题(中)

    上一文中,我们总结了java面试的基础,多线程,jvm的常见面试题,本文合肥北大青鸟合工大校区的袁老师继续介绍面试中网络.数据结构和算法.分布式理论和微服务的常见面试题. 一.网络 网络的话,主要集中 ...

  8. 北大java面试,北大青鸟java 面试--常见面试题(下)

    在之前的两篇文章中,我们已经提到了java面试中的常见问题,还有部分内容,合肥北大青鸟合工大校区的袁老师在本文也给出,希望对大家的面试过程有些帮助.这是我总结的最后一部分常见面试题:分别是数据库,基础 ...

  9. Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)

    总览 问题 详解 String.intern()的作用 link LeetCode的Two Sum题 link 什么是可重入锁? link 谈谈LockSupport link 谈谈AQS link ...

最新文章

  1. 数学图形(1.21)蚌线
  2. Java程序员应该知道的10个Eclipse调试技巧
  3. C++ 11 深度学习(七)位运算常见操作
  4. ExtJS4.0的数据集 .
  5. 千万别让海底捞知道你的生日
  6. pycocotools安装_pycocotools安装问题
  7. Adobe发布基于HTML5技术的网络开发工具以解决跨平台问题
  8. matlab7.0的序列号
  9. springboot项目去除druid监控的广告超链接等
  10. 新能源车如何走出“一票否决”的窠臼?
  11. [重庆思庄每日技术分享]-数据库创建组件时报错ORA-30554: XDB.XDB$ACL_XIDX is disabled
  12. php 处理树形数据,php设计模式之组合模式——处理树形结构数据
  13. 2018年视频云服务市场格局进入整合阶段,阿里云视频云位居市场竞争力领导者的位置
  14. 极限的四则运算和洛必达法则的使用条件
  15. 89c51的万年历c语言,用AT89C51与DS1302做的万年历c语言编程
  16. java html5转pdf文件_Java 将Html转为PDF
  17. (面向对象)员工信息管理系统 1.当有新员工的时候将员工加入到管理系统 2.可以根据工号实现对该员工信息查询 3.可以现实查看所有员工信息 4.可以修改员工的薪水
  18. 九龙证券|二股东迎大变革,这只零售股连收4板
  19. 动态规划及动态规划的应用
  20. 购买二手DTX-1800注意事项

热门文章

  1. 2017年中国人工智能产业专题研究报告(完整版)
  2. 人生第一次:领年终,拿股票!
  3. 怎么做到的?美术生居然转型做程序员?
  4. 重返全球第三,小米做对了什么?
  5. Decode()函数使用技巧
  6. spring mvc-REST
  7. android线程及线程池
  8. 5G空口存疑 革新还是4G演进?
  9. Flask 教程 第十三章:国际化和本地化
  10. java.sql.SQLException: Lock wait timeout exceeded