最为一个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知识点复习(第一次)相关推荐

  1. 虚拟机的分类_「面试必备」Java虚拟机知识点复习手册(下)

    关注我的微信公众号:后端技术漫谈 不定期推送关于后端开发.爬虫.算法题.数据结构方面的原创技术文章,以及生活中的逸闻趣事. 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边 ...

  2. CSS3知识点复习与总结

    CSS3知识点复习与总结 文章目录 CSS3知识点复习与总结 一.术语解释 CSS规则 = 选择器 + 声明块 二.CSS书写位置 1.内部样式表 2.内联样式表,元素样式表 3.外部样式表 三.常见 ...

  3. 三年级下册期中计算机知识点,部编三年级语文下册期中知识点复习

    文件大小:   资料格式:  下载:284次 资料等级:     所需点数:0 课件类型:/word 注册本站会员,享受高速下载,立即注册会员 部编三年级语文下册期中知识点复习部分内容预览 第一单元知 ...

  4. SSM框架知识点复习

    第三节 SSM框架知识点复习 SpringMVC的知识 技能:使用SpringMVC来处理浏览器发起的请求. ① SpringMVC的基本使用流程 i. 导入jar包 ii. 配置SpringMVC的 ...

  5. c语言各个英文的作用,C语言最重要的知识点复习资料(国外英文资料).doc

    C语言最重要的知识点复习资料(国外英文资料) C语言最重要的知识点复习资料(国外英文资料) The log Share the next list of return logs in the hidd ...

  6. 4十4十4写成乘法算式_小学数学二年级下册数学1-4单元知识点复习提前准备才能考的更好...

    期中考试快到了,小学数学二年级下册1-4单元知识点复习,为考试做准备! 第一单元数据收集与整理 1. 收集数据的方法: (1) 民意调查:如投票选举. (2) 实地调查:如现场观察,收集,统计数据. ...

  7. 软件测试小黑指北-知识点复习

    ======================软件测试知识点复习======================== 请认真思考以下问题: 什么是软件?........................... ...

  8. 江苏省计算机二级c语言复习知识点,计算机二级C语言知识点复习

    C语言已先后被移植到大.中.小及微型机上,它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序.下面是小编收集的关于计算机二级C语言知识点复习,希望 ...

  9. 全国计算机等级AJIL,全国计算机二级VB知识点2015第一次课

    <全国计算机二级VB知识点2015第一次课>由会员分享,可在线阅读,更多相关<全国计算机二级VB知识点2015第一次课(20页珍藏版)>请在人人文库网上搜索. 1.全国计算机二 ...

  10. 【面试】计网知识点复习与总结

    [面试]计网知识点复习与总结 1. 计算机网络层次结构 ISO/OSI七层网络模型与TCP/IP五层网络模型的比较如图所示: 物理层:它的主要作用是传输比特流,进行模数转换与数模转换,这一层的数据叫做 ...

最新文章

  1. Linux服务之Samba服务篇
  2. Numpy入门教程:11. 时间日期和时间增量
  3. Longest Common Prefix
  4. linux select 多路复用机制
  5. php界面设置编码格式,php设置编码格式的方法
  6. 随手小记:都是反着的
  7. Ubuntu 深圳活动有感兴趣的朋友吗?
  8. 挑战IPOD功能最强MP3——Zune二代评测
  9. 定义域可以写成不等式吗_证单变量不等式(一)
  10. Ruby 安装 - Linux
  11. w7测算计算机分级,HSW-E平台跑分竟失败:需要打补丁
  12. java计算机毕业设计糖果销售管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  13. 检索有关计算机系统功能设计方面的文献,基于词汇功能识别的科研文献分析系统设计与实现-武汉大学信息检索.PDF...
  14. [Vue warn]: Property or method “throttle“ is not defined on the instance but referenced during rende
  15. 甲方安全开源项目清单
  16. Python入门技能树-程序设计思想:练习题个人总结
  17. 计算机考试文字颜色不对,2017年计算机一级考试WPS2007:让公式中的文字变个颜色...
  18. 推荐:我为这个职位准备了四年(转)
  19. c语言整形符号位_c语言获取符号位整数和浮点
  20. xx.exe 中的 0x7c92e4df 处最可能的异常: 0xC0000008: An invalid handle was specified

热门文章

  1. BZOJ1027[JSOI2007] 合金
  2. 高德地图只显示某个省份
  3. LVM 逻辑卷管理(原理概念篇)
  4. Linux中/etc/rc开头文件详细解释
  5. oracle9i阻塞,Oracle 9i 整体性能优化概述(zt)
  6. anaconda双版本python_Anaconda中安装多版本Python及切换
  7. python接口测试_【Python自学】Python接口自动化测试的学习 - 伊凡Ivan
  8. spark保存数据到hbase_Spark读取Hbase中的数据
  9. idea新建一个springboot项目_SpringBoot(二):第一个Spring Boot项目
  10. mysql怎么查看记录时间戳_mysql TIMESTAMP(时间戳)详解——查询最近一段时间操作的记录...