JVM知识点汇总(2)

这篇具有很好参考价值的文章主要介绍了JVM知识点汇总(2)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一. 垃圾回收的优点和原理. 并考虑两种回收机制

二. 垃圾回收器的基本原理是什么? 垃圾回收器可以马上回收内存吗? 有什么办法主动通知虚拟机进行垃圾回收?

三. Java 中会存在内存泄露嘛? 请简单描述

四.Ststem.gc() 和 Runtime.gc() 会做什么事情

五. finalize() 方法是什么时候被调用? 析构函数(finalization) 的目的是什么

六. 什么是分布式垃圾回收(DGC)? 它是如何工作的?

七. 串行(serial) 收集器和吞吐量(throughput) 收集器的区别是什么

八. 简述 Java 内存分配与回收频率以及 Minor GC 和 Major GC

九. JVM 的永久代中会发生垃圾回收么

十. Java 中垃圾收集的方法有哪些

十一. 什么是类加载器, 类加载器有哪些

十二. 类加载器双亲委派模型机制


一. 垃圾回收的优点和原理. 并考虑两种回收机制

Java语言中有一个显著的特点就是引入了垃圾回收机制, 使 C++ 程序员最头疼的内存管理的问题迎刃而解. 它使得 Java 程序员在编写程序的时候不需要考虑内存管理. 由于有个垃圾回收机制, Java 中的对象不再有 "作用域" 的概念, 只有对象的引用才有 "作用域". 垃圾回收可以有效的防止内存泄漏, 有效的使用可以使用的内存. 垃圾回收器通常是作为一个单独的低级别的线程运行, 不可预支的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收, 程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收.

二. 垃圾回收器的基本原理是什么? 垃圾回收器可以马上回收内存吗? 有什么办法主动通知虚拟机进行垃圾回收?

对于 GC 来说, 当程序员创建对象时, GC 就开始监控这个对象的地址、大小以及使用情况. 通常, GC 采用有向图的方式记录和管理堆(heap) 中的所有对象. 通过这种方式确定哪些对象是"可达的", 哪些对象是"不可达的". 当 GC 确定一些对象为 "不可达" 时, GC 就有责任回收这些内存空间. 程序员可以手动执行 System.gc() 通知 GC 运行, 但是 Java 语言规范不保证 GC 一定会执行.

三. Java 中会存在内存泄露嘛? 请简单描述

所谓内存泄漏就是指一个不再被程序使用的对象或变量一直被占据在内存中. Java 中有垃圾回收机制, 它可以保证一对象不再被引用的时候将自动被垃圾回收器从内存中清除掉. 由于 Java 使用有向图的方式进行垃圾回收管理, 可以消除引用循环的问题.

Java 中的内存泄露的情况: 长周期的对象持有短生命周期对象的引用就很可能发生内存泄漏, 尽管短生命周期对象已经不再需要, 但是长生命周期对象持有它的引用而导致不能回收, 这就是 Java 中内存泄漏的发生场景. 通俗的说, 就是程序员可能创建了一个对象, 以后一直不在使用这个对象, 这个对象却一直被引用, 即这个对象无用但是却无法被垃圾回收器回收, 这就是 Java 可能出现内存泄漏的情况, 例如: 缓存系统, 我们加载了一个对象放在缓存中(例如放在一个全局 map 对象中), 然后一直不再使用它, 这个对象一直被缓存引用, 但却不再被使用.

检查 Java 中的内存泄漏, 一定要让程序将各种分支情况都完整执行到程序结束, 然后看某个对象是否被使用过, 如果没有, 则才能判定这个对象属于内存泄漏.

如果一个外部类的实例对象的方法返回了一个内部类的实例对象, 这个内部类对象被长期引用了, 即使那个外部类实例对象不再被使用, 但由于内部类持有外部类的实例对象, 这个外部类对象将不会被垃圾回收, 这也会造成内存泄漏.

四.Ststem.gc() 和 Runtime.gc() 会做什么事情

这两个方法用来提示 JVM 要进行垃圾回收. 但是立即开始还是延迟进行垃圾回收是取决于 JVM 的.

五. finalize() 方法是什么时候被调用? 析构函数(finalization) 的目的是什么

GC 决定回收某对象时, 就会运行该对象 finalize() 方法, 但是在 Java 中很不幸, 如果内存总是充足的, 那么垃圾回收永远不可能进行, 也就是说 finalize() 可能永远不会被执行, 显然指望它做收尾工作是靠不住的. 那么 finalize() 最主要的用途就是回收特殊渠道申请的内存. Java  程序有垃圾回收器, 所以一般情况下内存问题不用程序员操心. 但是有一种 JNI (Java Native Interface) 调用 non-Java 程序(C 或 C++), finalize() 的工作就是回收这部分的内存.

六. 什么是分布式垃圾回收(DGC)? 它是如何工作的?

RMI 使用 DGC 来做自动垃圾回收. 因为 RMI 包含了跨虚拟机的远程对象的引用, 垃圾回收是很困难的. DGC 使用引用技术算法来给远程对象提供自动内存管理.

七. 串行(serial) 收集器和吞吐量(throughput) 收集器的区别是什么

吞吐量收集器使用的并行版本的新生代垃圾收集器, 它用于中等规模和大规模数据的应用程序. 而串行收集器对大多数的小应用(在现代处理器上需要大概 100M 左右的内存) 就足够了

八. 简述 Java 内存分配与回收频率以及 Minor GC 和 Major GC

  • 对象优先在堆的 Eden 区分配
  • 大对象直接进入老年代
  • 长期存活的对象将直接进入老年代

当 Eden 区没有足够的空间进行分配时, 虚拟机会执行一次 Minor GC.  Minor GC 通常发生在新生代的 Eden 区, 在这个区的对象生存期短, 往往发生 GC 的频率较高, 回收速度比较快; Full GC/Major GC 发生在老年代, 但是通过配置, 可以在 Full GC 之前进行一次 Minor GC 这样可以加快老年代的回收速度.

九. JVM 的永久代中会发生垃圾回收么

垃圾回收不会发生在永久代, 如果永久代满了或者超过了临界值, 会触发完全垃圾回收(Full GC)

注: Java8 中完全移除了永久代, 新加了一个叫做元数据区的 native 内存区

十. Java 中垃圾收集的方法有哪些

标记-清除:

这是垃圾收集算法中最基础的, 根据名字九可以知道, 它的思想就是标记哪些要被回收的对象, 然后统一回收. 这种方法很简单, 但是主要会有两个主要问题:

  1. 效率不高, 标记和清除的效率都很低;
  2. 会产生大量不连续的内存碎片, 导致以后程序在分配较大的对象时, 由于没有充足的连续内存而提前触发一次 GC 动作.

复制算法:

为了解决效率问题, 复制算法将可用内存按容量划分为相等的两部分, 然后每次只使用其中的一块, 当一块内存用完时, 就将还存活的对象复制到第二块内存上, 然后一次性清除完第一块内存, 再将第二块上的对象复制到第一块. 但是这种方式, 内存的代价太高, 每次基本上都要浪费内存.

于是将该算法进行了改进, 内存区域不再是按照 1:1 去划分, 而是将内存划分为 8:1:1 三部分, 较大那份内存存交 Eden 区, 其余是两块较小的内存区叫做 Survior 区. 每次都会优先使用 Eden 区, 若 Eden 区满, 就将对象复制到第二块内存上, 然后清除 Eden 区, 如果此时存活的对象太多, 以至于 Survivor 不够时, 就将这些对象通过分配担保机制复制到老年代中. 

标记-整理: 

该算法主要是为了解决标记-清除产生的大量内存碎片问题; 当对象存活率比较高时, 也解决了复制算法的效率问题. 它的不同之处就是在清除对象时候先将可回收对象移动到右端, 不可清除对象移动到左端, 随即清除掉右端的对象, 这样就不会产生内存碎片了. 但缺点是整理阶段移动了可用对象, 需要去更新引用

分代收集: 

现在的虚拟机垃圾收集大多采用这种方式, 它根据对象的生存周期, 将堆分为新生代和老年代. 在新生代中, 由于对象生存周期短, 每次回收会有大量对象死去, 那么这时就采用复制算法. 老年代里的对象存活率高,  回收频率低, 采用标记-清除算法或标记-整理算法

十一. 什么是类加载器, 类加载器有哪些

实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器.

主要有以下四种类加载器:

  1. 启动类加载器: 用来加载 Java 核心类库, 无法被 Java 程序直接引用.
  2. 扩展类加载器: 它用来加载 Java 的扩展库. Java 虚拟机的实现会提供一个扩展库目录. 该类加载器在此目录里面查找并加载 Java 类.
  3. 系统性加载器: 它根据 Java 应用的类路径(CLASSPATH) 来加载 Java 类. 一般来说, Java 应用的类都是由它来完成加载的. 可以通过 ClassLoader.getSystemClassLoader() 来获取它.
  4. 用户自定义加载器: 通过继承 java.lang,ClassLoader 类的方式来实现

十二. 类加载器双亲委派模型机制

当一个类收到了类加载请求时, 不会自己先去加载这个类, 而是将其委派给父类, 由父类去加载, 如果此时父类不能加载, 反馈给子类, 由子类去完成类的加载.文章来源地址https://www.toymoban.com/news/detail-522457.html

到了这里,关于JVM知识点汇总(2)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM知识点(二)

    1、G1垃圾收集器 -XX:MaxGCPauseMillis=10,G1的参数,表示在任意1s时间内,停顿时间不能超过10ms; G1将堆切分成很多小堆区(Region),每一个Region可以是Eden、Survivor或Old区;这些区在内存上不是连续存放的; 每一块Region大小都是相同的,大小为1-32M,若Region对象存储不下,大小超

    2024年02月11日
    浏览(41)
  • JVM知识点整理

    JVM GC只回收堆区和方法区内的基本类型数据和对象。 栈区的数据(仅指基本类型数据),在超出作用域后会自动出栈释放掉,所以其不在JVM GC的管理范围内。 关联面试题:fullgc会回收方法区(元空间)吗? 1.常量对象不再任何地方被引用的时候,这个常量可以被回收 2.无用类

    2024年02月09日
    浏览(39)
  • 1、JVM相关知识点-类加载机制

    当我们用java命令运行某个类的main函数启动程序时,首先需要通过 类加载器 把主类加载到 JVM 通过Java命令执行代码的大体流程如下: 其中loadClass的类加载过程有如下几步: 加载 验证 准备 解析 初始化 使用 卸载 加载:在硬盘上查找并通过IO读入字节码文件,使用到类时才会

    2024年04月10日
    浏览(45)
  • Java面试知识点(全)-数据结构和算法

    Java面试知识点(全)https://nanxiang.blog.csdn.net/article/details/130640392 注:随时更新 数组 数组的下标寻址十分迅速,但计算机的内存是有限的,故数组的长度也是有限的,实际应用当中的数据往往十分庞大;而且无序数组的查找最坏情况需要遍历整个数组;后来人们提出了二分查

    2024年02月05日
    浏览(62)
  • 面试必备之模电知识点汇总

    1、HC为COMS电平,HCT为TTL电平 2、LS输入开路为高电平,HC输入不允许开路,HC一般都要求有上下拉电阻来确定 输入端无效时的电平。LS却没有这个要求 3、LS输出下拉强上拉弱,HC上拉下拉相同 4、工作电压:LS只能用5V,而HC一般为2V到6V 5、CMOS可以驱动TTL,但反过来是不行的。

    2024年03月17日
    浏览(54)
  • Java面试汇总——jvm篇

    目录 JVM的组成: 1、JVM 概述(⭐⭐⭐⭐) 1.1 JVM是什么? 1.2 JVM由哪些部分组成,运行流程是什么? 2、什么是程序计数器?(⭐⭐⭐⭐) 3、介绍一下Java的堆(⭐⭐⭐⭐) 4、虚拟机栈(⭐⭐⭐⭐) 4.1 什么是虚拟机栈? 4.2 垃圾回收是否涉及栈内存? 4.3 栈帧内存分配越大越好吗? 4.4

    2024年01月17日
    浏览(42)
  • Java 面试知识点

    基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的 语法,集合的语法,io 的语法,虚拟机方面的语法。 和都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为 true 时,整个运算结果才为 true,否

    2024年02月16日
    浏览(42)
  • java面试常见知识点

    JDK(Java Development Kit)是Java开发工具包,是整个JAVA的核心,包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。 JRE是运行基于Java语言编写的程序所不可缺少的运行环境。JRE中包含了JVM,runtime class libraries和Jav

    2024年02月11日
    浏览(55)
  • Java面试知识点(全)- Java面试基础部分一

    Java面试知识点(全)https://nanxiang.blog.csdn.net/article/details/130640392 语法基础 封装 利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联

    2024年02月05日
    浏览(46)
  • Java基础-知识点03(面试|学习)

    String 类是Java中用于表示字符串的类。在Java中,字符串是一系列字符的序列,用于表示文本数据。 String类的作用及特性 1、 创建字符串 : 可以通过字符串字面量或使用new来创建字符串对象。 2、 字符串长度 : 可以使用length()方法获取字符串的长度。 3、 字符串连接

    2024年04月15日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包