Java内存管理-程序运行过程(一)「建议收藏」

勿在流沙住高台,出来混迟早要还的。做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!相信在做Java开发的伙伴一定知道 JVM(Java Virtual Machine(Java虚拟机)!本系列会开启对JVM相关的知识的探索和总结,让我们一起踏入JVM的学习之旅中,去了解和发现更加精彩的Java世界! 正如奥古斯特·罗丹 说过:世界上不是缺少美,而是缺少发现美的眼…

大家好,又见面了,我是全栈君。

做一个积极的人

编码、改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


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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121036.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 超全,7种经典推荐算法模型及应用

    超全,7种经典推荐算法模型及应用本文调研了推荐系统里的经典推荐算法,结合论文及应用进行分析、归纳并总结成文,既是自己的思考过程,也可当做以后的翻阅手册。前言个性化推荐,是指通过分析、挖掘用户行为,发现用户的个性化需求与兴趣特点,将用户可能感兴趣的信息或商品推荐给用户。本文调研了推荐系统里的经典推荐算法,结合论文及应用进行分析、归纳并总结成文,既是自己的思考过程,也可当做以后的翻阅手册。俗话说学而时习之,人的认识过程是呈螺旋式上升的,特别是理论应用到实践的过程,理论是实践的基础,实践能反过来指导人对理论的认识,我相信在将下文所述的算法应

    2022年6月23日
  • 全网最详细完备的class类文件结构解析

    全网最详细完备的class类文件结构解析写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答Class文件是一组以8位字节为基础单位的二进制流,不同的数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有任何空隙存在。这些数据项目由无符号数和表来存储数据,按照顺序依次是:1.魔数和Class文件的版本2.常量池3.访问标志4.类索引、父类索引与接口索引集合5.字段表

    2022年5月6日
  • sql查询序列是否存在_oracle if判断是否为空

    sql查询序列是否存在_oracle if判断是否为空sql如下:selectsequence_namefromuser_sequenceswheresequence_name=’参数’需要注意的是oraclesequence参数必须转换成大写。例子:(这是使用simple框架实现)//判断oraclesequence是否已经存在publicstaticbooleanisSequenceExi…

    2022年10月10日
  • Java正则表达式 匹配中文字符[通俗易懂]

    Java正则表达式 匹配中文字符[通俗易懂]若要用JAVA正则表达式匹配中文字符,主要是了解中文字符的编码。

    2022年6月18日
  • 百度网盘下载提速,推荐3种亲测有效的方法

    百度网盘下载提速,推荐3种亲测有效的方法凉透的下载工具自从PanDownload事件之后,陆续出了很多第三方的度盘不限速下载神器,但是最后都凉了,这些第三方下载神器,都是个人开发者,即便有盈利也承受不起巨大的风险。甚至有款下载神器,用爱发电!流程是这样的,1.用户提交下载链接,2.然后开发者先下载好资源(当然开发者开的是超级会员),3.最后下载完成后保存到阿里云,然后再发送给用户。当然最后还是凉凉了!比如PDown、Dupan、忆寻,最终还是都死掉了,很可惜!现在还有没有百度网盘加速下载的方法呢?这里从解决实际问题的角度上,给大家

    2022年4月28日
  • elasticsearch集群搭建_Linux如何关闭kafka集群

    elasticsearch集群搭建_Linux如何关闭kafka集群安装包自己自行准备,或者用我百度网盘的安装包,ElasticSearchLogstashKibanaFileBeat:**链接:**https://pan.baidu.com/s/1_Iv2R8pmYaHkoaOk_m8OuQ提取码:5ezt复制这段内容:后打开百度网盘手机App,操作更方便哦创建普通用户ES不能使用root用户来启动,必须使用普通用户来安装启动。这里我们创建一个普通用户以及定义一些常规目录用于存放我们的数据文件以及安装包等。创建一个es专门的用户(必须)使

    2022年10月13日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号