高级 java 体系课第 1 期第二周作业
作业题:JVM 虚拟机论述题
作业一定要用自己的语言描述。复制粘贴可不是自己的!感觉自己这么说,能说明白了就达到标准了!
题目 01- 请你用自己的语言向我介绍 Java 运行时数据区(内存区域)
堆:Java 堆在 JVM 启动时创建内存区域去实现对象、数组与运行时常量的内存分配,它是虚拟机管理最大的,也是垃圾回收的主要内存区域 。
虚拟机栈:顾名思义虚拟机栈是 JVM 中的栈数据结构,此种数据结构是基于线程的,创建了一个线程就相当于创建了一个虚拟机栈,例如我们最熟悉的 main 方法启动,就启动了一个虚拟机栈。
本地方法栈:虚拟机使用到的 Native 方法(比如 C++方法)服务。
方法区(永久代、元空间):方法区(Method Area)是可供各个线程共享的运行时内存区域,方法区本质上是 Java 语言编译后代码存储区域,它存储每一个类的结构信息
运行时常量池(字符串常量池):
1.运行时常量池:一个 class 对象有一个运行时常量池
1.1 字面量:数值型(int、float、long、double)、双引号引起来的字符串值等
1.2 符号引用:Class、Method、Field 等
2.字符串常量池:全局只有一个字符串常量池
2.1 双引号引起来的字符串值
直接内存:并不是虚拟机运行时数据区的一部分,也不是《Java 虚拟机规范》中定义的内存区域。是指 Java 应用程序通过直接方式调取的系统内存,所谓 直接的关系指的是与底层操作系统的关系。
为什么堆内存要分年轻代和老年代?
答:为了兼顾了垃圾收集的时间开销和内存的空间有效利用。大量的对象都是用完即销毁,就回答被回收资源,但是有一些对象资源是可以熬过多次资源回收的,对于这种资源就需要放入到老年代中,以较低的频率回收资源,这样避免重复创建回收;而大部分数据可以放入新生代区域中,以较高的频率回收资源。
题目 02- 描述一个 Java 对象的生命周期
解释一个对象的创建过程
对象创建要 加载——验证——准备——解析——初始化——使用——卸载 ,除去最后两个剩余的就是一个类加载的过程,具体为 new 指令开始创建对象,验证是指验证是否已加载,未加载的类加载,已经加载的继续向下执行下一步。然后分配内存空间,对象内存空间数据初始化零值,为准备。然后将对象的内存空间与对象的相关信息的信息头绑定,为解析。执行 init 方法初始化。
解释一个对象的内存分配
分为指针碰撞(地址连续,适用新生代)和空闲列表(地址不连续,适用老年代)
解释一个对象的销毁过程
对象的 2 种访问方式是什么?
句柄、直接指针
为什么需要内存担保?
题目 03- 垃圾收集算法有哪些?垃圾收集器有哪些?他们的特点是什么?
算法:
Mark-Sweep 标记清除算法
Copying 拷贝算法
Mark-Compact 标记压缩算法
垃圾收集器:
ParNew 收集器:
新生代并行(ParNew),老年代串行(Serial Old)
Serial 收集器的多线程版本
ParallelScavenge 收集器 :
吞吐量优先收集器
新生代使用并行回收收集器,采用复制算法
老年代使用串行收集器
ParallelOld 收集器:
Parallel Scavenge 收集器的老年代版本,使用多线程和“标记-整理”算法。
在注重吞吐量,CPU 资源敏感的场合,都可以优先考虑 Parallel Scavenge 加 Parallel Old 收集器。
CMS 收集器:
低延迟:减少 STW 对用户体验的影响【低延迟要求高】
并发收集:可以同时执行用户线程
CMS 收集器不能像其他收集器那样等到老年代几乎完全被填满了再进行收集,而是当堆内存使用率
达到某一阈值时,便开始进行回收。
CMS 收集器的垃圾收集算法采用的是标记-清除算法。
会产生内存碎片,导致并发清除后,用户线程可用的空间不足。
CMS 收集器对 CPU 资源非常敏感。
G1 收集器
并行与并发:充分利用多核环境下的硬件优势
多代收集:不需要其他收集器配合就能独立管理整个 GC 堆
空间整合:“标记-整理”算法实现的收集器,局部上基于“复制”算法不会产生内存空间碎片
可预测的停顿:能让使用者明确指定消耗在垃圾收集上的时间。当然,更短的 GC 时间的代价是回收空间的效率降低。
评论