您的位置:首页 > 编程语言 > Java开发

java运行机制——程序是怎么跑起来的?

2016-12-23 14:56 323 查看
平时老见到说什么jvm、加载static变量啥的,大致了解点,但感觉知识点不成系统,故在此整理一下:

        在我想当然的感知中,从最底层开始,不管啥跑起来肯定是给电路很多0、1信号,让电路线里的电流流动起来。但最底层的0/1控制线肯定比较繁琐枯燥,在大量的实践中,肯定有些0/1控制事件经常做,经常用,熟能生巧中人们就把这些操作逐渐给封装起来,用最精炼的方式花最少的人工操作代价来实现;然后再封装,在此打个比方最终封装成了顶层编号0-9999的10000个操作(这个难道是汇编层???);开发excel程序可能用了里面1、3、7、8... ....等301个操作,制作成了excel程序;用其中的1、2、4、6...
...等200个操作制作成了美图秀秀软件;用101、170、234、777... ...封装成了java虚拟机——jvm

       java能跨平台是因为jvm能跨平台,那jvm为什么能跨平台呢?

       我感觉jvm要是想跨平台,它应该能把java代码最终生成一套能在任何平台上运行的0/1代码,但其他语言如C等要在计算机上运行必然会生成0/1代码的,它们为什么不能跨平台?

       (不要以为只要生成了0/1代码就都一样了,不同的高级语言生成的0/1代码也是有差别的,还得再加工-->)

     好像在哪看过,说jvm能根据平台的特性,自动判断识别平台,然后将java语言编译生成跟平台适应的0/1代码,有句话叫“见人说人话,见鬼说鬼话”,jvm能见啥系统平台说啥话,jvm这种能力承载者叫————java解释器;而其他不能跨平台的语言是因为它就只有一套语言机制,只会说人话,见鬼之后就不会说鬼话了;

      (Java随身自带小小翻译官... ...其他高级语言去“外访”却没带随身翻译官!!!)

       java跨平台特性是在其他不能跨平台的语言基础上发展起来的,非跨平台语言是把高级语言编译成0/1代码,这一套流程感觉挺复杂的,多年应用下来也稳定了,java不可能彻底推翻这个机制重新创造,所以java从高级语言到0/1代码的过程应该跟其他非跨平台语言一样,也用了同样的机制————java编译器,只是在这之后java又加了一道工序(java解释器),把这些编译好的0、1代码给解释了下,使其跨了平台;

      

       安装jvm时我记得给其分配内存空间了,这个内存空间的意义是什么?

       从考虑java都有啥东西,都有啥地方可存储来捋一捋:

      java有: 类似于excel的应用程序(tomcat、jdk=jvm+jar包+... ...),类似于xx.xls的xx.java,xx.class文件;  

      java可用的存储空间有:内存、硬盘等;

     感觉tomcat、xx.java,xx.class类的东西应该在硬盘里;至于jdk, 这个就涉及到xx.class的运行,明显这东西是电脑的cpu进行运行的,但java可能出于什么考虑,模拟了电脑cpu的运行——jvm(中文名叫java虚拟机),相当于虚拟出一台电脑;虚拟出的电脑肯定得跟真实的电脑一样有个内存,这个内存就是安装jdk时给分配的内存;跟真实电脑的内存一样,里面肯定也得有寄存器、计算器、堆栈啥的;反正jdk就是在电脑cpu运行的程序的基础上进行精简组合构造的虚拟电脑;

    所以感觉jvm的安装程序应该在硬盘中,而类似cpu功能的东西应该在内存中;

    -----------------------------------------------------------------------------------------------------------------------------------------

    汇编是最低级的语言,也是最基本的语言,想一想汇编要运行得满足哪些最最最基本的条件?

     分配内存+指令(指示如何倒腾内存内容)

     “指令”指示如何倒腾“内存”内容

    Java程序就是各种指令,这个好理解,那么分配内存的活呢???答:被Java底层给悄悄干了,还不让你知道;

     所以整个说来,java的运行过程是:aa.java——>jvm编译器——>aa.class——>jvm解释器——>不同平台——>jvm(类cpu系列硬件功能)——>运行;



类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步;

     装载:查找和导入类或接口的二进制数据; 

     链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的; 

                校验:检查导入类或接口的二进制数据的正确性; 

                准备:给类的静态变量分配并初始化存储空间; 

                解析:将符号引用转成直接引用; 

     初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
初始化类中属性是静态代码块的常用用途,但只能使用一次。



     

      
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: