极客时间java高级(第二次课程)
极客时间java高级(第二次课程)
- 题目 01 请你用自己的语言介绍 Java 运行时数据区(内存区域)
- 01.堆、虚拟机栈、本地方法栈、方法区(永久代、元空间)、运行时常量池(字符串常量池)、直接内存
- a.堆:
- b.虚拟机栈:
- c.本地方法栈:
- d.方法区
- e.运行时常量池(字符串常量池)
- f.程序计数器
- g.直接内存
- 01.为什么堆内存要分年轻代和老年代?
- 题目 02 描述一个 Java 对象的生命周期
- 解释一个对象的创建过程
- 解释一个对象的内存分配
- 解释一个对象的销毁过程
- Step1:先确定垃圾
- Step2:给垃圾机会
- Step3:第二次被标记的对象就是真的要回收
- 对象的 2 种访问方式是什么?
- 通过句柄访问对象:
- 通过直接指针访问对象:
- 为什么需要内存担保?
- 垃圾收集算法有哪些?垃圾收集器有哪些?他们的特点是什么?
题目 01 请你用自己的语言介绍 Java 运行时数据区(内存区域)
01.堆、虚拟机栈、本地方法栈、方法区(永久代、元空间)、运行时常量池(字符串常量池)、直接内存
a.堆:
占用区域最大(占地盘的王者)
垃圾回收的主要内存区域(垃圾收集器的主要治理对象)
JDK各版本不断迭代区域划分,只为了更好更快地回收管理此区域
各线程公用空间(对比虚拟机栈)
b.虚拟机栈:
线程私有空间(从线程出生到死亡一直相伴)——生命周期相同
其大小决定了方法调用深度,报错的时候打的e.printstack就能看到层层调用。
StackOverFlow——标识栈内存设置小了,或者死循环了
那虚拟机栈里面在入栈出栈存的是什么东西呢——栈帧(栈帧:1.调用新方法,栈帧随之创建(方法在虚拟机帧中出入的通关文牒)2.存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等(方法执行时所有的必备信息)3.当前栈帧(当前方法——当前类)(执行引擎的操作对象)
c.本地方法栈:
与虚拟机栈的唯一区别就是服务对象不同服务对象:虚拟机栈————为java服务(字节码服务)做服务本地方法栈————为native方法(比如c++方法)做服务
d.方法区
方法区是一个概念区,其具体实现有:永久代,元空间。(类比于降温这个概念的具体实现有:吹风扇和吹空调)方法区要存储:1.class 2.运行时常量池 3.JIT编译器编译之后的代码缓存
永久代 | 元空间 | 比较 | |
---|---|---|---|
应用时间 | JDK1.8以前 | JDK1.8以后 | 元空间逐步替代永久代 |
存储区域 | 存储区域是JVM内存所占用区域 | 物理内存区域 | 占用jvm内存管理空间就得让jvm操心内存移除和垃圾回收的事情 |
存储内容 | 方法区需要存的都存 | 只存类的元信息,静态变量和运行时常量池交给堆来存 |
e.运行时常量池(字符串常量池)
class常量池 | 运行时常量池 | 字符串常量池 | |
---|---|---|---|
范围情况 | 一个class文件只有一个class常量池 | 一个class对象有一个运行时常量池 | 全局只有一个字符串常量池 |
存储内容 | 字面量和符号引用 | 字面量和符号引用 | 双引号引起来的字符串 |
一个叫dog的class文件有一个自己的**class常量池**。
如果实例化了两个对象:dog1和dog2,则dog1和dog2各有自己的**运行时常量池**;
但是不管有多少个对象和文件,全局也是只有一个**字符串常量池**。
f.程序计数器
从别的线程切换回来,程序计数器告诉你上回执行到哪了。(指路小天才)
g.直接内存
直接内存 | 堆内存 | |
---|---|---|
申请空间耗费性能 | 耗费更高的性能 | 性能耗费更低 |
IO读写性能 | 更优 | 对比直接内存差一些 |
使用场景 | 有很大的数据需要存储(生命周期长);频繁的IO操作(网络并发场景) | 数据不是很大 |
01.为什么堆内存要分年轻代和老年代?
就像是收拾街道的清洁工师傅,会把所负责的区域分成两块;
一块区域(年轻代)经常清理,然后把瓶子和纸盒收起来放到另一块区域(老年代);
然后年轻代经常清理,老年代隔一段时间清理一次(把瓶子和纸盒卖了)。
题目 02 描述一个 Java 对象的生命周期
解释一个对象的创建过程
new指令->>想准备买一口新锅,来专门来炒肉吃
常量池检查->>看看自己家里是不是买过这样的锅
是否已加载->>不过是新锅还是旧锅都要拿到厨放这个空间来(已经拿过来就不用拿了)
分配内存空间->>确保厨放有空间能放下这口锅
内存空间初始化为零值->>把灶台清理出来准备放锅
必要信息设置->>在锅盖上标记一下这个锅的用途
执行init方法->>对这个锅进行涂油开锅
解释一个对象的内存分配
就像是一个人(对象),来到旅店,要住宿,住进一个房间(内存分配)。
A旅店(Serial,ParNew)的房间是从头到尾进行分配的(内存空间连续),接着上个旅客入住的房子安排(指针碰撞)。
B旅店(CMS收集器和Mark-Sweep收集器)分配房间内存不连续,会维持一个空闲列表,来从中给旅客来分配空间(空闲列表)
解释一个对象的销毁过程
类比于黑帮清理门户,如果能和帮派中的常驻长老(类静态属性引用的对象)建立引用联系的(能为他们所用的),就不能当做清理对象,否则会被当做清理对象。当然在清理之前,会垃圾一个机会,如果垃圾能通过调用finlize方法,亮出免死腰牌证明自己是长老的人,则可以免除一死。否则第二次机会,还是被标记为垃圾,必死无疑。
Step1:先确定垃圾
一个对象,如果对于其他人没有用处(引用法)会被认定为垃圾。
一个对象,如果没有在Gcroots对象对象的可触达链路内,则会被认定为垃圾。可做GcRoots的对象:1.虚拟机栈中,栈帧的本地变量表引用的对象2.方法区中,类静态属性引用的对象3.方法区中,常量引用的对象4.本地方法栈中,JNI引用的对象
Step2:给垃圾机会
第一次被标记为垃圾之后,如果此对象有必要执行finalize方法.
在执行finalize方法后,还没有与引用链建立联系的会被第二次标记
Step3:第二次被标记的对象就是真的要回收
对象的 2 种访问方式是什么?
类似于作坊(JAVA栈,本地变量表)通过中介找劳工
通过句柄访问对象:
劳工的类型信息和具体劳工的地址信息由中介(句柄)来做保存。不管劳工怎么移动,作坊只要寻找句柄就可以了。
通过直接指针访问对象:
类似于作坊(JAVA栈,本地变量表)自己维护劳工的地址信息,劳工维护自己的类型信息。劳工移动,作坊的引用信息也要做更新。
为什么需要内存担保?
当年轻代通过自身的minoreGc,移动survivor区域都无法有足够空间来放入要加入的新对象时。
老年代会挺身而出,收留那希望在gc之后还存活的年轻代对象,以留出足够大的年轻代空间来收留新的对象。
垃圾收集算法有哪些?垃圾收集器有哪些?他们的特点是什么?
新生代使用算法 | 老年代使用算法 | 特点 | |
---|---|---|---|
ParNew 收集器 | 并行复制算法,暂停所有用户线程 | 串行标记整理算法,暂停所有用户线程 | 存在线程交互开销(单cpu性能不如Serial) |
ParallelScavenge 收集器 | 并行复制算法,暂停所有用户线程 | 串行标记整理算法,暂停所有用户线程 | 吞吐量优先 |
ParallelOld 收集器 | 并行复制算法,暂停所有用户线程 | 并行标记整理算法,暂停所有用户线程 | ParallelScavenge的老年代版本 |
CMS 收集器 | 无(CMS是专门的老年代收集器) | 并发回收,标记清楚 | 低延迟,会产生内存碎片,对CPU资源敏感 |
G1收集器 | 取消老年代年轻代的物理划分 | 取消老年代年轻代的物理划分 | 空间整合:标记整理,局部使用复制算法,但不会产生内存碎片。可预测的停顿 |
极客时间java高级(第二次课程)相关推荐
- 极客时间限时免费开放全部课程!别纠结了选这几门!
" 阅读本文大概需要 3 分钟. " 很多技术人对极客时间都比较熟悉了,但也许你还不知道专门服务企业的「极客时间企业版」,他们最近推出了一个活动,面向企业免费开放全部课程. 企业里 ...
- 极客时间 自我提升第二天 数据结构与算法之美 应该掌握 / 趣谈网络原理 / 深入浅出计算机组成原理 思维导图
菜鸟今天又来完成所说的诺言,也希望大家督促,在今天的学习中,菜鸟有了新的认知,我会将上一篇中理解不完善的一些地方进行补充,学习本就是不断打破自己的认知,如果思考都不做,何来的知识的积累 文章目录 数据 ...
- 极客时间-算法训练营-第二周
文章目录 学习笔记 1.哈希表 定义 图示 具体实现是Map和Set HashSet源码分析 HashMap源码分析 时间复杂度 实战题目 [242. 有效的字母异位词](https://leetco ...
- 【极客时间】《Java并发编程实战》学习笔记
目录: 开篇词 | 你为什么需要学习并发编程? 内容来源:开篇词 | 你为什么需要学习并发编程?-极客时间 例如,Java 里 synchronized.wait()/notify() 相关的知识很琐 ...
- 本人亲自整理的极客时间设计模式之美的硬核笔记
由于笔记内容过多,我把它放到语雀上了. 点击我 以下内容是为了让搜索引擎,检测到这篇文章.要阅读体验,请点击上面的连接"点击我",去我的语雀看.对了,我看到语雀那里有投诉的功能,请 ...
- 【极术读书】赠卡活动第二期,免费领极客时间月卡系统学习技术管理
报名链接 极术读书是极术社区推出的读书栏目.极术读书专栏定期推荐嵌入式,人工智能,物联网,云计算,安全,半导体等智能计算领域的图书及技术管理类图书,同时策划社区赠书活动和作者webinar方便读者交流 ...
- 极客时间高级Java工程师体系课2.0
高级Java性能优化的七个方向 下栽の地止:https://lexuecode.com/6572.html 1.复用优化 在写代码的时候,你会发现有很多重复的代码可以提取出来,做成公共的方法.这样,在 ...
- 白嫖正版《极客时间》课程的正确姿势
人工智能时代下,Python已然变身"网红语言",不只是技术圈在讨论,学生.上班族都在学习Python来提高自己的工作效率.增强职业竞争力. TIOBE发表的Python" ...
- 极客时间《Java并发编程》学习笔记
该领域是跟着"极客时间"平台的课程<Java并发编程>入门的,讲师是王宝令.说实话,这个领域如果抱着大部头的书就啃的话,由于缺少实践很难会建立一个体系,即不知道为什 ...
- 重磅开源!推荐一个以最优惠的方式购买极客时间课程的开源项目!
简介 以最优惠的方式购买极客时间的课程. 做为一名互联网人是要终身学习的,总是要学习很多知识点的,总是会买很多课程来学,但是很多课程都很贵,最终没有学到相应的知识点. 极客时间 是一个轻松学习,高效学 ...
最新文章
- 赛迪研究院发布《2018年中国自动驾驶产业发展及投资价值白皮书》!
- lambda表达式可以用来声明_Lambda 的骚操作,你都get到了没
- Linux环境安装Mysql
- 逻辑漏洞-token绕过
- .NET6中关于Minimal API的简单使用
- PHP操作视频音频类 FFmpegPHP
- Java集合系列---TreeMap源码解析(巨好懂!!!)
- qt qthead里如何响应信号_Qt之QThread(深入理解)
- 蓝桥杯小朋友排队java_1215. 小朋友排队
- (转) 用虚函数实现多态
- MySql统计函数COUNT详解
- 数据库实验八 触发器实验
- 类iGoogle实现参考资料
- 多年来我的创业感悟,穷人与富人的赚钱思维模式丨国仁猫哥
- java计算机毕业设计学生宿舍信息管理源程序+mysql+系统+lw文档+远程调试
- [C++]typedef typename什么意思?
- 计算机一级B考试总结500字,期中考试反思作文500字
- 2022年版中国人工智能芯片行业专项调研及投资前景方向预测报告
- 圣斗士星矢限制服务器注册,圣斗士星矢服务器内BUG公告介绍
- 随便写写,都是我从网上收集的东西!