勿在流沙住高台, 出来混迟早要还的.
做一个积极的人
编码, 改 bug, 提升自己
我有一个乐园, 面向编程, 春暖花开!
相信在做 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 程序在的执行过程:
程序运行前
有些编程语言编写的程序会直接向操作系统请求内存, 但 Java 并不支持那么做. 当程序准备执行时, 由 JVM 向操作系统请求一定的内存空间, 称为初始内存空间. 程序执行过程中所需的内存都由 Java 虚拟机从这片内存空间中划分. 这样做的一个重要优点是保证了程序的平台无关性.
程序运行中
Java 程序一直向 Java 虚拟机申请内存, 当程序所需内存空间超出初始内存空间时, Java 虚拟机会再次向操作系统申请更多的内存供程序使用.
程序运行内存溢出
程序接着运行, 当 Java 虚拟机已申请的内存达到了规定的最大内存空间, 但程序还需要更多的内存, 这时会出现内存溢出的错误.
从上面的三个阶段, 可以看出程序是如何执行和分配内存的, Java 程序所使用的内存是由 Java 虚拟机进行管理, 分配的. Java 虚拟机规定了 Java 程序的初始内存空间和最大内存空间, 开发者只需要关心 Java 虚拟机是如何管理内存空间的, 而不用关心某一种操作系统是如何管理内存的.
谢谢你的阅读, 如果您觉得这篇博文对你有帮助, 请点赞或者喜欢, 让更多的人看到! 祝你每天开心愉快!
不管做什么, 只要坚持下去就会看到不一样! 在路上, 不卑不亢!
博客首页 : http://blog.csdn.net/u010648555 http://blog.csdn.net/u010648555
愿你我在人生的路上能都变成最好的自己, 能够成为一个独挡一面的人
? 每天都在变得更好的阿飞云
Java 内存管理 - 程序运行过程(一)
来源: http://www.bubuko.com/infodetail-2993344.html