一行JAVA代码如何运行起来?
gudong366 2025-03-08 12:53 20 浏览
在程序员的世界中,你总会听到一句“PHP是世界上最好的语言”的调侃。然而在你进入软件程序开发之后,你会发现即使开发语言千千万,最盛行的还是JAVA。从淘宝的技术变迁中我们可以见一些端倪,早期电商刚起来的时候,那会儿的互联网还很简单,使用PHP+Mysql+Apache+Linux就可以快速搭建起一套电商系统,但随着电商平台、支付平台的完善,网上购物开始变得简单,越来越多的人使用淘宝购物了,淘宝的技术架构也开始不断的升级,增加服务器数量来提高系统可用性。
通过运维手段扩充资源是一种方式,治标不治本,最根本的原因还是在于PHP这种语言可扩展性不够,用户量十万、百万、千万的时候都还能支撑,但到了上亿、亿万的时候怎么扩展都不行了。于是淘宝系统开始一点点的前后端分离,后端使用JAVA语言开发,逐渐迁移业务。现在我们所使用的淘宝系统,80%以上的后端程序都是Java开发,可见笑到最后才是赢家啊。不过JAVA语言的上手难度就比PHP、前端高很多了,所以今天我们给大家讲解下一行JAVA代码到底是如何运行起来的,JAVA后浪们可以以此为入门Java的基础,开启Java开发、人生赢家之路。
Java是一种半解释型语言,相对的有解释型语言Python&PHP、编译型语言C&C++。解释型语言说的是只需要在客户端输入代码后就可以运行起来,实时看到结果,编译型语言说的是源代码需要进行构建编译成二进制文件才能在机器运行起来,半解释型语言介于其中,它把输入的代码进行编译,编译后在JVM虚拟机中运行(注:JVM虚拟机是在实际的机器中运行的)。半解释型语言的好处就是可以跨平台,一次编译,多次执行。
我们通过下面这边Java程序,来讲明Java程序从编译到最后运行到整个流程。JVM运行Java程序有两种方式,分别是jar包和Class类文件,jar包是偏上层的方式,把所有程序都打包成一个jar包,便于交付测试人员测试、运维人员发布,它的运行逻辑是通过java.exe找到java自带的GetMainClassName函数,该函数获取JNIENV实例,并调用JarFileJNIENV实例中的GetMainfest()函数获取MainClass函数,Main函数再调用Java.c中的LoadClass方法加载主类。
而Class方式则是越过上层,直接通过main函数调用Java.c中的LoadClass方法装载类。所以说jar运行的方式本质上也是class类运行的方式,因此我们来关注如何类方式如何加载运行就好了。下面代码想实现的功能是打印Code这个字符,整体代码如下。我们先定义了一个类HelloJava,在这个类新建了一个对象去打印Code字符,而这个对象又调用了类Product.java
在整个代码的运行中,包含两步,第一步是编译,第二步是运行。源文件创建完之后,使用javac就可以编译.java程序,程序会被编译成.class文件,使用java命令就可以运行.class文件。编译后的文件有代码中出现过的类名&变量名&方法引用名、类中各个方法的字节码,它们分别存储在常量池、方法字节码中。
在Java程序的编译过程中,如果该类所依赖的类还没有被编译,编译器就会先编译被依赖的类,如果依赖类编译了则直接引用。在Java类的运行中,包含加载和运行两个步骤。.class文件就是通过类加载器到jvm当中的。在Java中默认有三种类加载器,从下往上依次是自定义类加载器UserClassLoader(负责加载自定义的class文件)、应用类加载器AppClassLoader(负责加载classpath指定的jar包和目录中的class文件)、扩展类加载器ExClassLoader(负责加载Java平台中扩展功能的jar包)、启动类加载器BootstrapClassLoader(负责加载$JAVA_Home中jre/lib/rt.jar中所有的class类)。当AppClassLoader接收到一个类加载命令后,它不会自己先去加载,而是给到扩展类加载器,同样扩展类加载器自己也不会先去加载类,而是把它给到启动类加载器去加载,如果失败再层层往下传递。所以Java是动态在加载类。
回到我们刚刚的例子中,在编译好Java程序后,我们得到HelloJava.class文件,在终端我们输入javaHelloJava,系统就会启动一个JVM进程,JVM进程从classpath的路径中寻找命名为HelloJava.class的二进制文件,将HelloJava的类加载信息加载到运行时数据区的方法区,找到HelloJava的主函数入口,执行Main函数。Main函数的第一条命令是Productproduct = newProduct(“Code”),它需要JVM创建一个Product对象,但此时方法区中没有没有Product类的信息,于是JVM加载Product类,把Product类的类型信息放在方法区中。加载完了Product类之后,JVM虚拟机在堆区为新的Product实例分配内存,初始化类。在调用product.printName()方法的时候,JVM根据Product引用找到Product对象,根据Product对象持有的引动定位到方法区中的Animal类的类型信息方法表,获取printName()函数的字节码地址,运行printName()函数,打印出来“Code”。
微观的编译执行介绍完了,我们来看看中观的执行。在介绍Java是解释型语言时,我们有讲到JVM是跨平台执行的,也就是一份Java代码编译之后,可以在Linux、unix、Windows、Macos等操作系统平台中执行。我们一起来看看是如何实现的呢?在Java程序运行中有三个概念,JVM、JDK、JRE。
- 所谓JVM就是Javavirtual Machine,Java虚拟机,执行Java代码;
- 所谓JDK是指的JavaDevelopment kit,Java开发工具包,Java开发人员使用;
- 所谓JRE就是JavaRuntimeEnvironment,Java运行时环境。
JVM属于JRE,JRE属于JDK。在JDK的安装中,有不同的版本,比如Linuxx86、Windowsx64,只要安装了JDK之后,就由JDK来区分操作系统,JVM是运行在操作系统之上,区分操作系统的任务就是由JDK来完成的,只要你的电脑装了JDK,任何一份Class字节码都会运行在JVM中,JVM又可以运行在任意操作系统中,从而实现了“跨平台一次编译,多次执行”。
讲完了中观的执行,我们来看看宏观执行。我们程序员在写Java代码时,都会把程序编译成jar包,通过jar包来运行程序。一个jar包代表了一个功能模块的实现,如果某个jar包有我们想要使用的功能,就在程序中引用就好。然而业务功能在开发实现时可运行依赖的jar包很多,如果把每个功能所实现的jar包都放在自己的jar包中,就会非常的浪费资源和运行效率。这时候我们可以把程序依赖的jar包都放在一个单独的文件夹中,然后修改jar包中“META-INF”目录下的“MANIFEST.MF”清单文件即可。在manifest文件中,我们指定Manifest文件的版本,运行主类的名称,程序所依赖的jar包的Classpath路径都写明清楚,Java程序执行时加载manifest文件即可。
本文详细的介绍了一行JAVA代码是如何在JVM系统中运行起来的,对于有志加入互联网行业,使用Java语言开发贡献力量的朋友们来说,可以在初学时深刻的理解体会到Java代码时怎么运行起来的、JDK&JRE&JVM是什么?在面试的时候也能比较轻松从容的回到面试官问题,在带新人的时候也可以装一把大佬。码字不易,赶紧收藏起来这份Java宝典吧,如果你愿意,点个在看和喜欢,把它也传递给你的伙伴们喔~
相关推荐
- U盘文件被删怎么简单恢复(u盘里的文件被误删了怎么找回)
-
现在这个社会不是靠关系靠路子,主要还是靠实力。刘强在机关工作,人长得帅气,工作能力又强。唯独一样不好,脾气太大,动不动就发火,因为小事常和同事发生口角。一次他火大的差点把办公桌给掀翻了,领导见他野蛮的...
- 不小心删除了一些文件?9 个最佳免费硬盘恢复软件
-
恢复您曾经无意或意外删除的所有文件和数据。您是否曾经错误地删除了一个对您的工作至关重要并导致您丢失所有进度的文件?我们为您提供了一些最好的免费硬盘恢复软件,以帮助您恢复意外删除的文件,以解决您的文件删...
- Studio 中文版:数据救援神器,误删 / 分区损坏 / RAID 恢复一键找回
-
Studio中文版:数据救援神器,误删/分区损坏/RAID恢复一键找回当文件意外删除、分区损坏,或RAID阵列崩溃时,一款可靠的数据恢复工具往往能挽回关键损失。R-Studio中文版...
- 你值得拥有的11款Linux数据恢复工具
-
如果你使用的是Linux操作系统,那么你一定想知道一旦硬盘崩溃的话又该如何保存和恢复数据。其实,现在有很多Linux数据恢复工具可以让我们摆脱数据安全的困扰。小编已经为各位准备好了一些最好的Linux...
- 误删文件内容怎么恢复(误删文件内容怎么恢复回来)
-
在日常使用电脑的过程中,误删文件的情况时有发生。无论是由于操作失误还是病毒攻击,误删文件都会给我们带来不小的困扰。幸运的是,随着技术的发展,误删文件恢复已不再是难题。本文将介绍几款国内外知名的误删...
- u盘如何恢复删除的文件?推荐5款u盘数据恢复软件!
-
在日常生活与工作中,U盘作为便捷的数据存储载体,频繁用于传输和保存各类重要文件。然而,误删文件的情况却时有发生,无论是珍贵的照片、重要的工作文档,还是精心制作的视频,一旦删除,都可能带来不小的麻烦。...
- 怎么恢复删除的数据?5种有效的数据恢复方法汇总!
-
在数字化办公与生活的时代,电脑里的每一份数据都承载着重要信息。然而,一个误操作就可能导致数据被删除,无论是尚未保存的重要文档,还是珍藏多年的照片,都可能瞬间“消失”。但其实,数据删除并不意味着永久丢...
- u盘删除文件怎么找回?5个数据恢复工具汇总,助你巧妙恢复数据!
-
在日常使用U盘的过程中,误删文件的情况时有发生,重要的工作文档、珍贵的照片视频一旦消失,难免让人焦急万分。别担心,只要选对数据恢复工具,被删除的数据仍有找回的可能。下面就为你汇总5款实用的数据...
- Linux下恢复误删文件:思路+实践(linux删除如何恢复)
-
周五篮球群里有人问误删文件了怎么恢复,得知是ext4文件系统之后我推荐了ext4magic这个工具,然后又有人提到了xfs的话怎么办,正好前几天看到DaveChinner在邮件列表里提到了这个问题,...
- 苹果放大招!不用虚拟机了,Mac直接跑Linux容器,开发者效率翻倍
-
苹果这次真给开发者送福利了!今天凌晨(6月10日),苹果在官宣的Containerization框架直接炸了技术圈——Mac现在能原生运行Linux容器镜像了!这可不是虚拟机那种“套娃”方案,而是基...
- 7 款老牌经典软件,值得收藏(经典老歌软件)
-
Calibrehttps://calibre-ebook.com/Calibre是一个电脑电子书管理软件。肯定有人说了,电子书还要管理?那当然了。它的功能更强大的让你想象不到,首先它可以导入PDF,...
- 神仙级的免费开源电子书阅读器,还支持听书功能
-
神仙级的免费开源电子书阅读器,还支持听书功能,极空间部署『KoodoReader』哈喽小伙伴们好,我是Stark-C~前段时间不是给大家分享的电子书管理工具『TaleBook』嘛~,然后就有粉丝私信...
- 如何在Ubuntu系统中重置root密码(ubuntu忘记密码重置root密码命令)
-
很多人有个问题,就是喜欢把密码设置得很长很复杂,结果谁也没防住,却成功防住了自己ヽ(.ˇдˇ;)ノ对于现代人,特别是年轻人,都有过忘记密码的经历吧。在这篇文章中,我们来了解如何在Ubuntu1...
- 5款功能强大的PDF阅读器,让PDF阅读更轻松
-
分享5款功能强大的PDF阅读器,拥有丰富的PDF阅读工具,支持PDF文档划线、笔记、标记等操作,让PDF阅读更轻松!1.嗨动PDF编辑器一款实用的PDF处理软件,不仅可以阅读PDF文档,还能直接编辑、...
- 上班摸鱼利器! 免费好用的电子书阅读器,NAS轻松部署Koodo Reader
-
哈喽,大家好我是生活爱好者。笔者也是一名小说爱好者,平时用手机用某信读书,会员也开了,在家看体验也不错,但是上班的时候,在工作快速完成之后,想摸个鱼用手机就不太方便啦,作为爱折腾的人,必须要工作认真,...
- 一周热门
- 最近发表
- 标签列表
-
- linux一键安装 (31)
- linux运行java (33)
- ln linux (27)
- linux 磁盘管理 (31)
- linux 内核升级 (30)
- linux 运行python (28)
- linux 备份文件 (30)
- linux 网络测试 (30)
- linux 网关配置 (31)
- linux jre (32)
- linux 杀毒软件 (32)
- linux语法 (33)
- linux博客 (33)
- linux 压缩目录 (37)
- linux 查看任务 (32)
- 制作linux启动u盘 (35)
- linux 查看存储 (29)
- linux乌班图 (31)
- linux挂载镜像 (31)
- linux 软件源 (28)
- linux题目 (30)
- linux 定时脚本 (30)
- linux 网站搭建 (28)
- linux 远程控制 (34)
- linux bind (31)