基础知识《零》---Java程序运行机制及运行过程
Java运行机制
Java虚拟机(Java Virtual Machine):Java虚拟机可以理解成一个以字节码为机器指令的CPU;对于不同的运行平台,有不同的虚拟机;Java虚拟机机制屏蔽了底层运行平台的差别,真正实现了“一次编译,随处运行”。

Java垃圾回收(Garbage Collection):不用使用的内存空间应该回收;在C/C++等语言中,由程序员负责回收无用的内存;Java语言消除了程序员回收无用内存的职 责,它提供一种系统级线程跟踪存贮空间的分配情况,并在JVM空闲的时候,检查并释放那些可以被释放的内存空间;垃圾收集在java程序运行过程中自动进 行,程序员无法控制和干预。
Java运行过程
Java源文件(*.java)——>Java编译器——>字节码文件(*.class)——>类装载器——>字节码校检器—— >解释器——>操作系统(Windows、Linux等)整个文件Load到内存区,一系列动作之后形成操作系统认识的代码,操作系统找到 main方法开始实行。

【类加载器:类加载器负责加载java API(JVM+java API被称为java运行时),其实这些jar包主要分布在jre/lib下,这些我们可以通过在java命令后加-verbose:class(如下图),可见第一个被载入的java类是Object类。】
以下转载自360图书馆
heap——>new 出来的东西放在这里
stack——>局部变量
data segment——>静态变量或字符串常量
code segment——>存放代码
局部变量:方法或是语句块内部定义的变量(local variable)
成员变量:方法外部、类内部定义的变量,也叫做全局变量(glbal valiable)
Java Application初步
一个源文件中最多只能有一个public类,其他类的个数不限。程序的入口是:
public static void main(String[] args){...}
Java 语言严格区分大小写和格式。
java中程序执行过程及内存分配情况:
下面用一个程序例子来说明内存的分配,程序如下:

注意:下面图中的堆和栈应该互换一下,本人在画图时搞反了!
1.首先用new定义了一个对象test,(于用new来定义对象或变量)其内存分配情况如下:

2.然后定义了一个整形变量date,其值为9.内存分配情况如下:

3.接着用new定义了两个对象,d1和d2.其内存分配情况如下:

4.接着用test来调用其方法change1,调用了方法,进行了值传递。在调用时将9赋予变量i,后面在函体内只是改变了变量i的值,而没有改变date的值。内存分配情况如下:

5. 由于变量i是在调用函数change时分配的,在函数调用结束就回收了变量i的内存分配。调用完后内存分配情况如下:

6.调用test的change2函数,将d2作为参数传递给形参。在调用函数时在内存堆中分配一个对象b的空间,然后在内存栈中通过值传递分配实际单元与值。在调用change2时,执行函数体内的语句,只是改变了对象b中的内容,而d1中的内容未改变。内存分配情况如下:

7.在调用完函数后,回收b的内存空间(包括堆与栈中的内容)。内存分配情况如下:

8.调用test的方法change3方法,在内存的堆中分配一块区域给形参对象b,在栈中的分配指向d1的区域,器内存分配情况如下:

9.然后执行函数中的语句,将对象d1中的值改变为22,调用函数结束后,回收堆栈中的内存空间。其内存分配情况如下:

注意:上面图中的堆和栈应该互换一下,本人在画图时搞反了!
综上所述,内存分配情况是:
1.new分配的变量在堆区域中,局部变量在栈区域中。
2.要想改变值时,只有当通过引用调用其方法才有作用发生。
程序在执行时,内存的情况是非常重要的,只有弄懂内存分配情况,才能跟好解决问题。
基础知识《零》---Java程序运行机制及运行过程的更多相关文章
- 【JAVA】【基础知识】Java程序执行过程
1. Java程序制作过程 使用文本编辑器进行编辑 2. 编译源文件,生成class文件(字节码文件) javac源文件路径. 3.运行程序class文件.
- Java程序在内存中运行详解
目录 Java程序在内存中运行详解 一.JVM的内存分布 二.程序执行的过程 三.只有一个对象时的内存图 四.两个对象使用同一个方法的内存图 五.两个引用指向同一个对象的内存图 六.使用对象类型作为方 ...
- 《Java基础知识》Java继承的概念和实现
继承时类和类之间的关系,是一个很简单很直观的概念,与显示生活中的继承(例如儿子继承了父亲财产)类似. 继承可以理解为一个类从另一个类中获取方法和属性的过程.如果类B继承于类A,那么类B就拥有类A的属性 ...
- DOS环境下含包并引用第三方jar的java程序的编译及运行
DOS环境下含包并引用第三方jar的java程序的编译及运行 1.程序目录机构 bin:class文件生成目录 lib:第三方jar包目录 src:源程序文件目录 2.程序代码: 3.程序编译 jav ...
- Nand Flash基础知识与坏块管理机制的研究
概述 Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次 ...
- Java程序运行内存机制
Java程序运行内存机制 栈内存包留调用方法.变量的区域,堆内存是new对象的区域,方法区为保存class文件的区域. 程序刚开始时,先加载类文件相应的数据到方法区,然后就从main()方法开始执行. ...
- java 程序运行的基础知识【Java bytecode】
聊聊文字,写一篇关于 java 基础知识的博文. JVM 线程栈 到 函数运行 每一个JVM线程来说启动的时候都会创建一个私有的线程栈.一个jvm线程栈用来存储栈帧,jvm线程栈和C语言中的栈很类似, ...
- java入门(1) 程序运行机制及运行过程
首先我们来看一下java程序在底层是怎么工作的: JAVA有两种核心机制: Java虚拟机(Java Virtual Machine): 1.java虚拟机可以理解成一个以字节码为机器指令的CPU. ...
- Java基础知识总结之垃圾回收机制
垃圾回收机制 Java垃圾回收机制是Java语言的重要功能之一.当程序创建对象,数组等引用类型对象时,系统会自动在内存区为之分配一块内存,对象就保存在这块内存区内,当这块内存不再被任何变量引用时,这块 ...
随机推荐
- Ibatis学习总结7--SqlMapClient 执行 SQL 语句
SqlMapCient 类提供了执行所有 mapped statement 的 API.这些方法如下: public int insert(String statementName, Object p ...
- python 元祖(tuple)
元祖和列表几乎相同,但是元祖一旦初始化是不可变更内容的 元祖的表示方式是caassmates=(), 要记住所有列表能用的.元祖都能用,但是就是不能变内容 注:记住,在python中的元祖,为了引起不 ...
- 详解在visual studio中使用git版本系统(图文)
很多人已经在使用git(或正在转移到git上),在github.com上,也看到园子里不少同学的开源项目,非常不错.但相关教程似乎不多,所以趁着我自己的开源项目源码托管(https://github. ...
- C# 域用户操作(转)
转自:http://www.sobnb.com/u/92/20081406091447.html using System; using System.DirectoryServices; nam ...
- Java设计模式-责任链模式(Chain of Responsibility)
接下来我们将要谈谈责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求.但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任 ...
- web前端开发常用的10个高端CSS UI开源框架
web前端开发常用的10个高端CSS UI开源框架 随着人们对体验的极致追求,web页面设计也面临着新的挑战,不仅需要更人性化的设计理念,还需要设计出更酷炫的页面.作为web前端开发人员,运用开源 ...
- 【CodeForces 625A】Guest From the Past
题 题意 一升奶可以花费a元,也可以话b元买然后获得c元,一开始有n元,求最多买多少升奶. 分析 贪心,如果b-c<a,且n≥b,那就买b元的,n先减去b再看看够买多少瓶,然后再+1瓶,余款再购 ...
- How to Write and Publish a Scientific Paper: 7th Edition(科技论文写作与发表教程)(11.04更新)
How to Write and Publish a Scientific Paper: 7th Edition(科技论文写作与发表教程)(11.04更新) 重要通知: 最近开题报告已差不多告一段落, ...
- alert对ajax阻塞调查(IE, Chrome, FF)
前阵子做保守工作,对一个js效果进行了改进,由于自己在chrome下测试没问题就丢给同事测试,同事用的是FF,发现不正常,后来又发现这个js在IE10下也不行,不得不调查,结果发现Chrome的ale ...
- C++_Eigen函数库用法笔记——Block Operations
Using block operations rvalue, i.e. it was only read from lvalues, i.e. you can assign to a block Co ...