Java内存管理-程序运行过程(一)
勿在流沙住高台,出来混迟早要还的。
做一个积极的人
编码、改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
愿你我在人生的路上能都变成最好的自己,能够成为一个独挡一面的人

© 每天都在变得更好的阿飞云
Java内存管理-程序运行过程(一)的更多相关文章
- Java内存管理-掌握虚拟机类加载器(五)
勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇介绍虚拟机类加载机制,讲解了类加载机制中的三个阶段,分别是:加载.连接(验证.准 ...
- Java内存管理-掌握虚拟机类加载机制(四)
勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇介绍了整个JVM运行时的区域,以及简单对比了JDK7和JDK8中JVM运行时区域 ...
- 你必须了解的java内存管理机制(一)-运行时数据区
前言 本打算花一篇文章来聊聊JVM内存管理机制,结果发现越扯越多,于是分了四遍文章(文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8),本文为其中第一篇.from 你必须了解的java内存 ...
- 你必须了解的java内存管理机制(三)-垃圾标记
本文在个人技术博客不同步发布,详情可用力戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩... 相关链接(注:文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8) ...
- 你必须了解的java内存管理机制(四)-垃圾回收
本文在个人技术博客不同步发布,详情可用力戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩... 相关链接(注:文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8) ...
- 你必须了解的java内存管理机制(二)-内存分配
前言 在上一篇文章中,我们花了较大的篇幅去介绍了JVM的运行时数据区,并且重点介绍了栈区的结构及作用,相关内容请猛戳!在本文中,我们将主要介绍对象的创建过程及在堆中的分配方式. 相关链接(注:文章讲解 ...
- Java内存管理的进一步理解-模拟过程图解
Java内存管理的进一步理解-模拟过程图解--转载 java的内存管理分为: 1.堆内存:2.栈内存:3.方法区:4.本地方法区 /* 1:方法区 方法区存放装载的类数据信息包括: ...
- Java内存管理:Java内存区域 JVM运行时数据区
转自:https://blog.csdn.net/tjiyu/article/details/53915869 下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些, ...
- java 程序运行过程 简介
这里的Java程序运行过程,是指我们编译好代码之后,在命令行开始执行java xxx命令,到java程序开始执行起来的这一过程,我们称其为运行时. 第一步,操作系统解析我们输入的java xxx命令, ...
随机推荐
- adb查看安卓设备系统Android版本
adb shell getprop "ro.build.version" 结果中如下两项便是版本信息: [ro.build.version.release]: [4.4.4][ro ...
- 【tomcat】sessionId学习(未完待续)
这里主要研究tomcat中session的管理方式以及sessionId的原理,下文将研究sessionid存到redis中以及基于redis实现session共享. 平时也就是了解session是基 ...
- redis实现消息队列&发布/订阅模式使用
在项目中用到了redis作为缓存,再学习了ActiveMq之后想着用redis实现简单的消息队列,下面做记录. Redis的列表类型键可以用来实现队列,并且支持阻塞式读取,可以很容易的实现一个高性 ...
- shiroWeb项目-记住我(自动登陆实现)(十五)
用户登陆选择“自动登陆”本次登陆成功会向cookie写身份信息,下次登陆从cookie中取出身份信息实现自动登陆. 用户身份实现java.io.Serializable接口便于反序列化 package ...
- Linux驱动开发必看详解神秘内核(完全转载)
Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入L ...
- C++ virtual函数重写,在继承的时候没有在函数前写virtual关键字也依然是虚函数吗?
比如: class Base { Base() {}; ~Base() {}; virtual void Init(); }; class Derived:public Base { virtual ...
- 去除Many2one字段的“创建并编辑”选项
要去除Many2one字段的“创建并编辑”选项,只要在view.xml里对应的field定义里增加options="{'no_create_edit':1}即可 <field name ...
- 微信支付之JsApi支付
常见问题:金额错误,微信金额是int类型,最小单位为分,即是1 客户端调用微信支付的时候一闪而过:这个原因是因为微信商户后台支付目录地址没设置对,导致js调用的时候验证没通过 .aspx页面设置: x ...
- 【python】xsspider零碎知识点
1.提取url信息 urlparse() from urlparse import urlparse url = "http://scrapy-chs.readthedocs.io/zh_C ...
- 通配符(WildCard)的使用
一.关于WildCard:一个web应用,有成千上万个action声明,可以利用struts2提供的映射机制把多个彼此相似的映射关系简化成一个映射关系,即通配符. 1.新建类 ActionWildCa ...