做一个积极的人

编码、改bug、提升自己

我有一个乐园,面向编程,春暖花开!

推荐阅读

第一季

0、Java的线程安全、单例模式、JVM内存结构等知识梳理
1、Java内存管理-程序运行过程(一)
2、Java内存管理-初始JVM和JVM启动流程(二)
3、Java内存管理-JVM内存模型以及JDK7和JDK8内存模型对比总结(三)
4、Java内存管理-掌握虚拟机类加载机制(四)
5、Java内存管理-掌握虚拟机类加载器(五)
6、Java内存管理-类加载器的核心源码和设计模式(六)
7、Java内存管理-掌握自定义类加载器的实现(七)
第一季总结:由浅入深JAVA内存管理 Core Story

第二季

8、Java内存管理-愚人节new一个对象送给你(八)
【福利】JVM系列学习资源无套路赠送
9、Java内存管理-”一文掌握虚拟机创建对象的秘密”(九)
10、Java内存管理-你真的理解Java中的数据类型吗(十)
11、Java内存管理-Stackoverflow问答-Java是传值还是传引用?(十一)
12、Java内存管理-探索Java中字符串String(十二)

实战

一文学会Java死锁和CPU 100% 问题的排查技巧

分享一位老师的人工智能教程。零基础!通俗易懂!风趣幽默!
大家可以看看是否对自己有帮助,点击这里查看【人工智能教程】。接下来进入正文。

勿在流沙筑高台,出来混迟早要还的。

相信在做Java开发的伙伴一定知道 JVM(Java Virtual Machine(Java虚拟机)!本系列会开启对JVM相关的知识的探索和总结,让我们一起踏入JVM的学习之旅中,去了解和发现更加精彩的Java世界! 正如奥古斯特·罗丹 说过:世界上不是缺少美,而是缺少发现美的眼睛。Java的世界也是如此!

本文地图:

知识地图

1、什么是程序

在计算机领域当中,程序就是为了能够让计算机执行某种特定操作或者说解决某种问题,而进行的一些列的指令的集合。这些指令又是指令呢?

指令是由一种二进制数码组成。一条指令通常也由两部分就行组成:操作码和地址码。

  • 操作码:操作码就是我们要完成的操作是什么样的类型或者性质,比如说取数、做加减法、输出数据等等。

  • 地址码:操作的对象的内容或所在存储单元的地址。

程序又是通过程序设计语言来实现的。在低级程序语言如机器语言、汇编语言中,程序是一组有序的指令序列及有关的数据;在高级程序语言中,如Java中,程序通常是一组说明和语句组成(数据结构+算法)。程序必须装入计算机内部才能实际起作用。

2、解释性语言和编译型语言

学过Java的人一定有听过这两个名词, 先说明一下Java是解释型语言。

为什么有这两种程序的运行方式出现呢?

因为:计算机不能直接理解高级语言,只能直接理解机器语言(也即0101),所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。

翻译的方式有两种:

  • 一个是编译

  • 一个是解释。

这两种程序方式只是翻译的时间不同。

举个例子:你现在JVM技术特别牛逼,受邀请去哈佛大学做一次主题演讲,自然,这要求你有很好的英语水平,如果你很不幸,和我一样,英语水平渣的一B,但是又不想放弃这次机会,你又如下两个选择:

  • 第一种方式: 带一个优秀的翻译伙伴,你演讲的时候说一句话,翻译伙伴帮你翻译成英文。好处:你可以畅所欲言;缺点:会拖延你的演讲时间。因为你说的每一句话,都必须等待翻译完才能继续。

  • 第二种方式:先将演讲稿写好,翻译成英文。如 Hello,Good Morning(哈喽,骨的猫宁)。好处:不会拖延你的演讲时间,你演讲也比较流畅、快速的进行;缺点:不能自由发挥,如你的演讲本来是上午,改为下午了,你就不在使用Hello,Good Morning(哈喽,骨的猫宁)了。

到这里如果你还没有看懂Java是属于哪一种的话,请继续往下看,学过c++/java 这类程序语言的伙伴肯定知道,这些程序最终都是依赖操作系统来执行的。

那么,可以这样理解,我们的程序就好像 ”汉语“ ,而操作系统只懂英语,为了让操作系统能够听过我们程序说的话(执行程序),可以选择第二种,在执行程序之前先编译成和操作系统相关的代码(汉语->英语),比如C/C++ 将cpp文件编译成exe文件,然后由操作系统执行,也就是编译执行。我们也可以选择第一种,执行的时候加载一个编译程序 ,动态的将源程序的每一行翻译成操作系统能理解的代码(汉语-> 翻译->英语),这就是解释执行。

编译执行快,但不够灵活,解释执行慢,运行时候要翻译程序(对于Java而言就是Java虚拟机),优点就是比较灵活。

JVM(Java虚拟机)就是充当了翻译的角色,所以说java是解释型语言。理解了上面这两个概念之后,也就能够理解为什么说Java 是一个跨平台的语言了。因为不同的操作系统上可以安装不同的JVM,也就是我们的汉语(Java源程序) 通过翻译 (JVM),可以翻译成不同的语言,让不同国家(不同的操作系统)的人听懂。

也就实现了 一次编程就可以到处运行的这个梦想。

注: 在Java刚面世的时候因为其是解释执行,性能是比较的慢,所以被C++等程序嘲笑,但是随着发展现在性能已经大大提升,不差于编译执行的程序了。努力终有发光的机会的。

3、程序的运行过程

在说Java程序运行的过程中,不得不说的三个组件: Java程序、Java虚拟机和操作系统。Java程序的运行是需要JVM的,JVM又要与操作系统交互获取内存和释放内存。这里通过三个阶段来说明一下之间的关系以及程序运行过程中内存分配是如何分配的。

java程序在的执行过程:

JVM原理

  • 程序运行前

有些编程语言编写的程序会直接向操作系统请求内存,但 Java并不支持那么做。当程序准备执行时,由 JVM 向操作系统请求一定的内存空间,称为初始内存空间。程序执行过程中所需的内存都由 Java 虚拟机从这片内存空间中划分。这样做的一个重要优点是保证了程序的平台无关性。

程序运行前

  • 程序运行中

Java 程序一直向 Java 虚拟机申请内存,当程序所需内存空间超出初始内存空间时,Java 虚拟机会再次向操作系统申请更多的内存供程序使用。

程序运行中

  • 程序运行内存溢出

程序接着运行,当 Java 虚拟机已申请的内存达到了规定的最大内存空间,但程序还需要更多的内存,这时会出现内存溢出的错误。

程序内存溢出

从上面的三个阶段,可以看出程序是如何执行和分配内存的,Java程序所使用的内存是由 Java 虚拟机进行管理、分配的。Java 虚拟机规定了 Java 程序的初始内存空间和最大内存空间,开发者只需要关心 Java 虚拟机是如何管理内存空间的,而不用关心某一种操作系统是如何管理内存的。

备注: 由于本人能力有限,文中若有错误之处,欢迎指正。


谢谢你的阅读,如果您觉得这篇博文对你有帮助,请点赞或者喜欢,让更多的人看到!祝你每天开心愉快!


Java编程技术乐园:一个分享编程知识的公众号。跟着老司机一起学习干货技术知识,每天进步一点点,让小的积累,带来大的改变!

扫描关注,后台回复【资源】,获取珍藏干货! 99.9%的伙伴都很喜欢

image.png | center| 747x519

© 每天都在变得更好的阿飞云
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐