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年2月28日 上午8:00
下一篇 2022年2月28日 上午9:00


相关推荐

  • c++中按位取反_取反和按位取反

    c++中按位取反_取反和按位取反#include<stdio.h>#include<iostream>usingnamespacestd;voidmain(){//做这类题目抓住两点:第一、无论是以进制表示还是整数形式赋值给变量,都要根据变量相应//的数据类型,表示为…

    2022年8月14日
    8
  • axios实现跨域三种方法_cors跨域axios

    axios实现跨域三种方法_cors跨域axios跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。所谓同源是指,域名,协议,端口均相同,浏览器执行js脚本时,会检查这个脚本属于哪个页面,如果不是同源页面,就不会被执行。以下举例:(1)http://www.123.com/index.html调用http://www.123.com/server.php(非跨域)(2)…

    2025年10月30日
    4
  • 线性回归模型详解(Linear Regression)

    线性回归模型详解(Linear Regression)线性回归和逻辑回归

    2026年3月18日
    2
  • 四款JAVA快速开发平台推荐

    四款JAVA快速开发平台推荐JBossSeamJBo 算得上是 Java 开源框架里面最优秀的快速开发框架之一 Seam 框架非常出色 尤其是他的组件机制设计的很有匠心 真不愧是 GavinKing 精心打造的框架了 虽然看起来还是有些缺陷 但是做企业应用项目的话 Seam 是一个很棒的选择 作为程序员来说 要比用 Spring Hibernate Struts 省心的多 更能够把精力放在业务逻辑的编写上面 开发效率

    2026年3月17日
    1
  • AssertValid函数学�

    AssertValid函数学�

    2021年12月8日
    59
  • php gmssl,关于GmSSL

    php gmssl,关于GmSSL关于 GmSSLGmSSL 是一个开源的密码工具箱 支持 SM2 SM3 SM4 SM9 ZUC 等国密 国家商用密码 算法 SM2 国密数字证书及基于 SM2 证书的 SSL TLS 安全通信协议 支持国密硬件密码设备 提供符合国密规范的编程接口与命令行工具 可以用于构建 PKI CA 安全通信 数据加密等符合国密标准的安全应用 GmSSL 项目是 OpenSSL 项目的分支 并与 OpenSSL 保持接口兼容 因此 GmSS

    2026年3月18日
    1

发表回复

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

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