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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 首页的显示和问题[通俗易懂]

    首页的显示和问题[通俗易懂]首页的显示和问题

    2022年4月21日
    58
  • Hibernate进阶之如何使用Hql内连接,外连接以及自连接

    Hibernate进阶之如何使用Hql内连接,外连接以及自连接

    2021年9月26日
    51
  • mysql中的enum是什么类型_数据库枚举类型是什么

    mysql中的enum是什么类型_数据库枚举类型是什么为什么使用枚举限定值的取值范围,比如性别(男,女,未知)等。枚举类型使用陷阱超级不推荐在mysql中设置某一字段类型为enum,但是存的值为数字,比如‘0’,‘1’,‘2’;解释1:你会混淆,因为enum可以通过角标取值,但它的角标是从1开始,对于不熟悉这个字段的人这里会出错解释2:enum类型的字段对于0与‘0’有非常大的区别,如果你是用0当角标做操作,因它没有这个角标,所要会报错;如果你使用‘

    2022年9月5日
    2
  • leavecriticalsection报错_sequence的用法

    leavecriticalsection报错_sequence的用法线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的用法注:使用结构CRITICAL_SECTION需加入头文件#include“afxmt.h”定义一个全局的锁CRITICAL_SECTION的实例和一个静态全局变量CRITICAL_SECTIONcs;//可以理解为锁定一个资源statici

    2022年9月20日
    0
  • Java最新下载安装教程

    Java最新下载安装教程一、网络原理OSI与TCP/IP各层的结构与功能,都有哪些协议TCP建立连接的过程,为什么要三次握手?TCP、UDP协议的区别,各自的应用场景打开浏览器,输入URL地址,访问主页的过程HTTP有哪些方法?HTTP和HTTPS有什么区别?二、Java核心技术HashMap底层数据结构是什么,时间复杂度多少?JDK8中对HashMap做了怎样的优化?HashMap和TreeMap什么区别?ConcurrentHashMap的实现原理包装类的

    2022年7月7日
    28
  • python numpy 矩阵转置

    python numpy 矩阵转置记录下问题…常规用法如下:值得注意的是行向量转换成列向量或者列向量转换成行向量,注意矩阵的定义。

    2022年6月2日
    34

发表回复

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

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