我的编程空间,编程开发者的网络收藏夹
学习永远不晚

关于JVM的基础知识有什么呢

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

关于JVM的基础知识有什么呢

这期内容当中小编将会给大家带来有关关于JVM的基础知识有什么呢,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

虚拟机给人的感觉像是操作系统、编译器:非常高大上。但是Java程序就跑在上面,遇到问题还得去排查,性能不行还得去优化,基础的知识还是需要的!

内存管理

Java虚拟机在执行的过程中会把它所管理的内存划分为若干个不同的数据区域,大致如下:

关于JVM的基础知识有什么呢

各部分的功能如下:

关于JVM的基础知识有什么呢

在内存管理部分比较大的一块内容是GC(垃圾回收),所谓垃圾回收就是将垃圾占用的内存回收掉。那么第一个问题:什么是垃圾?

  • 引用计数算法:被引用次数为0的对象。

  • 根搜索算法:从GC Roots沿着引用找不到的对象。

这里都提到了引用,在JDK 1.2之后Java就已经对引用的概念进行了扩充,那么第二个问题:有哪些类型的引用?

  • 强引用:Object o = new Object()这种都是强引用。

  • 弱引用:还有用但非必须的,在OOM之前被回收。

  • 软引用:更弱的引用,在下次GC的时候被回收。

  • 虚引用:最弱的,唯一的作用是在对象被回收的时候可以收到通知。

这里只有强引用才能对对象的生命周期造成影响。在虚拟机发展的过程中进化出不少垃圾回收算法,比如:

  • 标记-清除算法

  • 复制算法

  • 标记-整理算法

  • 分代收集算法

在实际中用到的回收器都是这几种算法的组合,比如从VisualVM中看到的内存是这样的(需要明白各部分都是怎样互相配合的):

关于JVM的基础知识有什么呢

整体上来看是分代收集算法,而S0、S1这两部分可以看做是标记-整理算法。那么第三个问题:常见的CMS垃圾回收器的执行流程是怎样的?

  • 初始标记:GC Roots直接关联的对象。

  • 并发标记:Root Tracing。

  • 重新标记:修复由于程序运行导致标记产生变动。

  • 并发清除

具体如下图所示:

关于JVM的基础知识有什么呢

可以看到只有在初始标记和重新标记的时候才需要Stop The World,其他都是和用户线程一起执行,不要以为这就完美了,并行执行的过程会消耗掉一些CPU资源。

代码执行

把Java源码丢给JVM肯定是不能执行的,需要先用javac编译成class文件才行,那么第一个问题:class文件的结构是怎样的?

  • 常量池

  • 访问标志

  • 类索引、父类索引和接口索引

  • 字段表

  • 方法表

  • 属性表

虚拟机规范并没有规定在什么时候要加载类,但是规定了在遇到new、反射、父类、Main的时候需要初始化完成。整个类的生命周期如下:

关于JVM的基础知识有什么呢

在虚拟机中通过ClassLoader来进行类的加载,这地方需要明白:

  • 两个类是否相同,除了类名外还需要判断ClassLoader是否相同。

  • 双亲委派模式并不是一个强制约束。

在类加载完成之后就可以开始执行了,和线程运转相关的东西都放在栈帧中,其结构如下:

关于JVM的基础知识有什么呢

执行中具体调用哪个方法是个头疼的问题,需要处理:

  • 静态分派:相同名称、不同参数类型的方法。

  • 动态分派:继承中复写的方法。

字节码中的指令都是基于栈的操作,比如要完成1+1这样的计算,对应的指令如下:

iconst_1 // 将常量1压入栈iconst_1iadd // 把栈顶的两个值相加并出栈,然后把结果放回栈istore_0 // 将栈顶的值放到局部变量表第0个Solt

解释执行的好处是下载后启动速度快,但是确定也非常明显:运行速度慢。JIT正是用来解决这个问题的,能够将多次调用的方法、多次执行的循环体编译成本地代码。

优化是个很好玩的题目,记得在参加一次变成比赛的时候用gcc -O3编译之后的代码把printf()都没输出了。。在JIT中比较常见的优化手段有:

关于JVM的基础知识有什么呢

程序执行一定会涉及到内存操作,在Java中定义了八种操作来完成:

关于JVM的基础知识有什么呢

这里有必要讲一下volatile的作用,在使用到的时候能明白下面两条即可:

  • 保证变量对所有线程是可见的。

  • 禁止指令重排优化。

如果Java中所有的操作都需要程序员来控制的话,会有大量的重复代码,而且写起来很累,那么我们可以通过先行发生原则来判断并行的两个操作是否存在冲突:

  • 程序次序规则:单线程内按照程序书写顺序。

  • 管程锁定规则:unlock必须在lock之前。

  • volatile变量规则:写操作先行发生于读操作。

  • 线程启动规则:Thread.start()先于线程的其他任意方法。

  • 线程终止规则:线程中所有的操作都先于对此线程的终止检测。

  • 线程中断规则:interrupt()先于中断检测。

  • 对象终结规则:对象的初始化完成先于它的finalize()方法。

  • 传递规则:如果A先于B、B先于C,那么A先于C。

Thread的底层实现还是比较麻烦的,但是最起码应该知道Thread的状态是如何进行转换:

关于JVM的基础知识有什么呢

最后,常见的同步方式是synchronized或者aqs的各种实现。

上述就是小编为大家分享的关于JVM的基础知识有什么呢了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

关于JVM的基础知识有什么呢

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

关于JVM的基础知识有什么呢

这期内容当中小编将会给大家带来有关关于JVM的基础知识有什么呢,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。虚拟机给人的感觉像是操作系统、编译器:非常高大上。但是Java程序就跑在上面,遇到问题还得去排查
2023-06-02

关于SSDP协议的基础知识

  网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。例如,网络中一个微机用户和一个大型主机的操作员进行通信,由于这两个数据终端所用字符集不同,因此操作员所输入的命令彼此不认识。在这一篇教程里面,小编就主要和大家简单的介绍一下:关于SSDP协议的基础知识。  不知道大家是否听说过SSDP协议这一个名词呢
关于SSDP协议的基础知识
2024-04-18

Python的基础知识点有什么

这篇文章主要讲解了“Python的基础知识点有什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python的基础知识点有什么”吧!集合(Set)及其函数集合是一个无序的、无重复元素的序列。
2023-06-16

关于运行于以太网基础协议的知识点

  以太网络使用CSMA/CD(载波监听多路访问及冲突检测)技术,并以10M/S的速率运行在多种类型的电缆上。以太网与IEEE802.3系列标准相类似。现在就跟着小编共同来学习一下:Cisco网络协议之关于运行于以太网基础协议的知识点。  一、引言概述  小编在前一段时间里面编写了一个关于网络监听的工具。为了能够准备的
关于运行于以太网基础协议的知识点
2024-04-18

关于无线上网的一些基础知识点

  无线上网是指使用无线连接的互联网登陆方式。它使用无线电波作为数据传送的媒介。速度和传送距离虽然没有有线线路上网优秀,但它以移动便捷为杀手锏,深受广大商务人士喜爱。现在就跟着小编共同来学习一下:关于无线上网的一些基础知识点。  一、前提介绍  非常的朋友还是在使用无线网络(也有人称之为WiFi或者是802.11网络)
关于无线上网的一些基础知识点
2024-04-18

Scrapy的基础知识是什么

Scrapy的基础知识是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我们将在这里介绍完Scrapy的基础知识架构简介下面是Scrapy的架构,包括组件以及
2023-06-17

puppet的基础知识是什么

今天给大家介绍一下puppet的基础知识是什么。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。puppet基础导puppet,这是目前运维主流的运维自动化工具,
2023-06-16

网络工程基础知识,关于网线的几个知识你是否了解?

  网线是我们日常中经常要使用到的网络拓布工具,一根小小的网线其实有着很大的网路知识,这些知识虽然不是那么的深奥,但也是作为一般的常识,在实际的操作使用中也是需要掌握的,下面带大家来看看一个小小的网线它到底有着哪些我们不知道的知识!如果你是一名网络工程师那么更需要来看看这些相关的概念!  1.网线为什么被称双绞线?  
网络工程基础知识,关于网线的几个知识你是否了解?
2024-04-17

linux运维需要掌握的基础知识有什么

这期内容当中小编将会给大家带来有关linux运维需要掌握的基础知识有什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。踏入linux运维工程师这一职业,其实有很多工具技能需要掌握,下面我来给大家一一介绍。
2023-06-06

适用于PHP开发人员的Python基础知识有哪些

今天就跟大家聊聊有关适用于PHP开发人员的Python基础知识有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。作为一种面向对象、直译式计算机程序设计语言,Python已经具有十多
2023-06-17

Linux网络管理的基础知识是什么

Linux网络管理的基础知识是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。网络基本配置文件网络连接配置文件(centos系):/etc/sysconfig
2023-06-16

 Python的基础知识及数据类型是什么

今天给大家介绍一下 Python的基础知识及数据类型是什么。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。1 基础知识1.1 Python的应用方向和语言特点1
2023-06-26

一定掌握的JVM内存管理知识都有什么

本篇文章给大家分享的是有关一定掌握的JVM内存管理知识都有什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java 引以为豪的就是它的自动内存管理机制。相比于 C++的手动内
2023-06-16

Java基础知识中ByteArrayOutputStream流的使用方法是什么

Java基础知识中ByteArrayOutputStream流的使用方法是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java ByteArrayOutputStream
2023-06-22

Java基础知识中StringWriter流的使用方法是什么

本篇文章为大家展示了Java基础知识中StringWriter流的使用方法是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java StringWriter流的使用一、StringWriter流
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录