程序执行流程:
java 程序代码执行流程:
java源文件----->java编译器------>java字节码(class文件)----->类装载器------>
java解释器/编译器加载到运行时系统(java虚拟机)----->操作系统---->硬件
怎样把程序装载到操作系统中?
系统给每个程序把内存分成四个分区:
第一个是.data区:存放的是程序的数据,静态的常量。
第二个是.code区:程序的执行代码,编译成可执行的内存代码(0011二进制数据),
加载到系统内存中。
第三个是:栈空间:在程序运行的时候使用的空间,最好不要超过6M(windows下一般是6M) 。
是连续的空间,所以访问速度和效率会比堆空间要高。
第四个是:堆空间:是不连续的空间,会有一些碎片。
说明:程序执行在code区,找到程序的主入口(Main函数)。从上往下执行代码,为函数中的变量
在栈空间中开辟内存空间,存储变量值。在code区中调用其它子函数。而当子函数执行完毕后,
为子函数变量分配的栈空间,要进行出栈操作,而这块内存空间就被清空掉,就不可再被使用的
(栈的回收,是操作系统的特性去实现的)。
在c语言程序中,可以通过malloc动态的申请一块内存空间,这块内存空间就是在堆内存中的。
而java中new Oject是在堆内存中存放这个对象的,而java虚拟机的垃圾回收机制就是去扫描堆内存
中的数据,若发现堆内存中的数据,在栈内存中没有引用的, 就会把这个对象回收。
例:person p = new person();可以分为下几步:
一,是定义了一个person的变量p(在栈内存中)。二,在堆内存中new出一个person对象。
三,把person对象的引用传给p。
而若定义person q; q = p;则是在栈空开辟了一块q的空间,然后再把p中的地址附给了q,
这样p和q就是指向相同的地址值,指的就是同一个对象,它们都可以 修改这个对象中的值,
而只有当p和q都null时, java虚拟机才会释放person对象。而p和q在栈内存中也有一定的
作用范围的,当p和q所在的方法执行完毕时,p和q的作用空间就失效了,就会执行出栈操作。
c语言比java执行效率高,是因为c语言可以由用户自己申请内存空间,用户自己释放内存空间。
而java是程序员自己把对象都至成Null,然后等待垃圾回收器去回收游离的对象,程序员无法
控制对象何时被回收。
c、c++语言程序泄露的原因?
就是程序员在堆内存中申请了过多的空间,用完之后又没有释放,就会导致内存泄露。
内存泄露特点:就是会随着程序运行的时间,占用的内存会起来越多。最后程序所申请的堆内存,
会超过操作系统所提供的内存。
因为堆内存是不连续的,所以就能申请到系统中所有的剩余内存。
说明:不管是java、linux、windows程序都是需要加载到内存中,才能被执行的。