JVM知识点复习(第一次)
最为一个java的初学者,其实可以不用太细致的学习java虚拟机,不过如果你是有一定的工作经验了,那JVM绝对是一个不应该绕开的点。具体的讲解可以参考周志明的《深入理解Java虚拟机》,如果是深度学习,建议还是看书。如果是作为了解大致,可以看看网上的视频,再来点博客差不多了。各个视频针对的JDK版本记住要看清楚,每个版本的JDK都或多或少有些差别,不要迷了眼。
文章目录
- 1、JVM概述
- 1.1、JVM位置
- 1.2、JVM体系结构
- 2、类加载器
- 2.1、模板类
- 2.2、类加载器的分类
- 3、沙箱安全机制
- 4、Native
- 5、PC寄存器
- 6、方法区
- 7、栈
- 8、三种不同的JVM
- 9、堆(重点)
- 9.1、新生区、老年区、永久区
- 9.2、对内存调优
- 9.3、GC垃圾回收
- 10、JMM
- 11、思维导图
1、JVM概述
1.1、JVM位置
我们都知道java是一个跨平台的语言,其跨平台的特性则是由于虚拟机的存在。
那JVM虚拟机到底在哪里呢?
我们的OS系统是部署在计算机硬件之上,我们的JVM则是部署在OS之上,再往上走,就是我们编写程序了。
1.2、JVM体系结构
我们程序的执行顺序是:我们编写的.java文件经过编译生成.class文件,然后再将我们的.class文件交给类加载器,然后再执行相应的操作。
这个图有些笼统,不过大致的体系结构就是这样,可以当作一个入门的体系结构图示
我经常在网上看到内存调优这个关键词,它更多的指的位置就是在对JVM中堆内存的调节。
2、类加载器
2.1、模板类
在java的进阶阶段,我们学习过反射,我们也都知道,所有的对象都是来自于一个类模板的Class。就好比一个Student类所创建的所有的对象,都来自于Student.class这个模板,这些所有创建出来的对象,都来自同一个地方。
2.2、类加载器的分类
随着JDK版本的变化,可能名称有些许出入
1、根加载器
2、扩展加载器
3、系统加载器
4、自定义加载器
当然这里还出现了一个很重要的双亲委派机制
3、沙箱安全机制
java用来保证程序安全引入的一种安全机制
4、Native
结合我们类加载器的知识点,凡是带有native关键字的,都说明这是java作用范围达不到的,它回去调用底层的C语言的库。
带有native关键字的方法就会进入到本地方法栈,其他的会进入java栈
本地方法接口(Native Interface):起初是为了融合C/C++,现在大多可用于驱动底层的硬件
本地方法栈(Native Method Stack):在本地方法栈中登记native方法,在执行引擎的时候加载本地库(Native Libraies)
5、PC寄存器
又名程序计数器Program Counter Register
PC寄存器为每一个线程所私有,占用内存十分小。用于记录各个线程正在执行的字节码指令地址。
6、方法区
该区域可以与PC寄存器形成鲜明的对比,它是被线程所共享。
我们常见的static、final、Class模板、常量池都存在于方法区。
7、栈
我们一想到栈首先应该想到的就是与它齐名的队列。
栈(木桶):先进后出
队列(水管):先进先出
栈中存放的东西:八大基本类型 + 对象的引用 + 实例的方法
当栈满了以后,就会出发栈满异常StackOverflowError
我们还有一个堆没有学习,学习玩堆以后,我们对于实例化一个对象,并且赋值调用的整个流程,心里应该是要有一个流程图了。
8、三种不同的JVM
- Sun:HotSpot(我们使用的)
- BEA:JRockit
- IBM:J9 VM
9、堆(重点)
我们前面说了基本上的JVM调优,指的就是堆调优
堆内存主要分为:新生区(伊甸园区)、养老区、永久区
9.1、新生区、老年区、永久区
对象最开始产生的地方是伊甸园区,当伊甸园区满了以后就会触发第一次GC(轻GC),存活下来的对象就会进入到幸存者区。当幸存者区也满了以后,就会再触发GC(重GC),然后依然存活的对象就会进入养老区
如果养老区满了以后就会报堆满异常OOM:
java.lang.OutOfMemoryError:Java heap space
当然,JDK不同的版本,具体的细节又有些差别,特别是名字
我的观点是,现在公司大部分使用的是JDK1.8,我们要做的就是记住1.8的就好了。但是巧就巧再没有专门说1.8的书,《深入理解java虚拟机》的第二版是JDK1.7,第三版是JDK12,13左右…那就只有官方文档加实践了。
9.2、对内存调优
我们前面说了,轻GC和重GC是可以用来处理堆内存的垃圾对象的。那么多久用一次轻GC?多久又用一次重GC?甚至是堆内存异常的时候,我们怎么排查呢?
所以对内存调优就是为了排查出异常,排查方式可分为两种:
- 使用Debug一行一行看
- 使用内存快照分析工具,如MAT、Jprofiler
9.3、GC垃圾回收
垃圾回收算法有哪些?
复制算法、标记清除算法、标记压缩算法
==复制算法:==伊甸园区的对象总是进入幸存区的from区,与此同时,幸存区的to区的数据也进入from区(幸存区的from区和to区是随时变化的)。所以每次伊甸园区的数据进入from区的时候,该区总是空的。
==标记清除算法:==对所有的对象进行扫描,然后对活着的对象进行标记,第二次扫描的时候,对于没有标记的对象进行清除。
==标记压缩算法:==在标记清除算法的基础上,我们被清除的兑现过的空间位置是不连续的,就会产生内存碎片。此算法主要是讲空间进行压缩,让存活的对象进行移动,是内存碎片变成大的内存空间。
内存效率:复制算法 > 标记清除算法 > 标记压缩算法(时间复杂度)
内存整齐度:复制算法 = 标记压缩算法 > 标记清除算法
内存利用率:标记压缩算法 = 标记清除算法 > 复制算法
没有最好的算法,只有最合适的算法,即GC也称为分代收集算法
年轻代:存活率低,使用复制算法
老年代:区域大存活率高,使用标记清除(内存碎片不是太多)+标记压缩算法混合实现
10、JMM
Java内存模型(Java Memory Mode)
核心概念:我们的每一个线程的工作内存和主存之间存在一个抽象关系,即线程之间的共享变量存储在主内存重,每一个线程都有一个私有的本地内存。
11、思维导图
JVM知识点复习(第一次)相关推荐
- 虚拟机的分类_「面试必备」Java虚拟机知识点复习手册(下)
关注我的微信公众号:后端技术漫谈 不定期推送关于后端开发.爬虫.算法题.数据结构方面的原创技术文章,以及生活中的逸闻趣事. 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边 ...
- CSS3知识点复习与总结
CSS3知识点复习与总结 文章目录 CSS3知识点复习与总结 一.术语解释 CSS规则 = 选择器 + 声明块 二.CSS书写位置 1.内部样式表 2.内联样式表,元素样式表 3.外部样式表 三.常见 ...
- 三年级下册期中计算机知识点,部编三年级语文下册期中知识点复习
文件大小: 资料格式: 下载:284次 资料等级: 所需点数:0 课件类型:/word 注册本站会员,享受高速下载,立即注册会员 部编三年级语文下册期中知识点复习部分内容预览 第一单元知 ...
- SSM框架知识点复习
第三节 SSM框架知识点复习 SpringMVC的知识 技能:使用SpringMVC来处理浏览器发起的请求. ① SpringMVC的基本使用流程 i. 导入jar包 ii. 配置SpringMVC的 ...
- c语言各个英文的作用,C语言最重要的知识点复习资料(国外英文资料).doc
C语言最重要的知识点复习资料(国外英文资料) C语言最重要的知识点复习资料(国外英文资料) The log Share the next list of return logs in the hidd ...
- 4十4十4写成乘法算式_小学数学二年级下册数学1-4单元知识点复习提前准备才能考的更好...
期中考试快到了,小学数学二年级下册1-4单元知识点复习,为考试做准备! 第一单元数据收集与整理 1. 收集数据的方法: (1) 民意调查:如投票选举. (2) 实地调查:如现场观察,收集,统计数据. ...
- 软件测试小黑指北-知识点复习
======================软件测试知识点复习======================== 请认真思考以下问题: 什么是软件?........................... ...
- 江苏省计算机二级c语言复习知识点,计算机二级C语言知识点复习
C语言已先后被移植到大.中.小及微型机上,它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序.下面是小编收集的关于计算机二级C语言知识点复习,希望 ...
- 全国计算机等级AJIL,全国计算机二级VB知识点2015第一次课
<全国计算机二级VB知识点2015第一次课>由会员分享,可在线阅读,更多相关<全国计算机二级VB知识点2015第一次课(20页珍藏版)>请在人人文库网上搜索. 1.全国计算机二 ...
- 【面试】计网知识点复习与总结
[面试]计网知识点复习与总结 1. 计算机网络层次结构 ISO/OSI七层网络模型与TCP/IP五层网络模型的比较如图所示: 物理层:它的主要作用是传输比特流,进行模数转换与数模转换,这一层的数据叫做 ...
最新文章
- Linux服务之Samba服务篇
- Numpy入门教程:11. 时间日期和时间增量
- Longest Common Prefix
- linux select 多路复用机制
- php界面设置编码格式,php设置编码格式的方法
- 随手小记:都是反着的
- Ubuntu 深圳活动有感兴趣的朋友吗?
- 挑战IPOD功能最强MP3——Zune二代评测
- 定义域可以写成不等式吗_证单变量不等式(一)
- Ruby 安装 - Linux
- w7测算计算机分级,HSW-E平台跑分竟失败:需要打补丁
- java计算机毕业设计糖果销售管理系统源码+系统+数据库+lw文档+mybatis+运行部署
- 检索有关计算机系统功能设计方面的文献,基于词汇功能识别的科研文献分析系统设计与实现-武汉大学信息检索.PDF...
- [Vue warn]: Property or method “throttle“ is not defined on the instance but referenced during rende
- 甲方安全开源项目清单
- Python入门技能树-程序设计思想:练习题个人总结
- 计算机考试文字颜色不对,2017年计算机一级考试WPS2007:让公式中的文字变个颜色...
- 推荐:我为这个职位准备了四年(转)
- c语言整形符号位_c语言获取符号位整数和浮点
- xx.exe 中的 0x7c92e4df 处最可能的异常: 0xC0000008: An invalid handle was specified
热门文章
- BZOJ1027[JSOI2007] 合金
- 高德地图只显示某个省份
- LVM 逻辑卷管理(原理概念篇)
- Linux中/etc/rc开头文件详细解释
- oracle9i阻塞,Oracle 9i 整体性能优化概述(zt)
- anaconda双版本python_Anaconda中安装多版本Python及切换
- python接口测试_【Python自学】Python接口自动化测试的学习 - 伊凡Ivan
- spark保存数据到hbase_Spark读取Hbase中的数据
- idea新建一个springboot项目_SpringBoot(二):第一个Spring Boot项目
- mysql怎么查看记录时间戳_mysql TIMESTAMP(时间戳)详解——查询最近一段时间操作的记录...