一行JAVA代码如何运行起来?JAVA代码运行方法
在程序员的世界中,你总会听到一句“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宝典吧,如果你愿意,点个在看和喜欢,把它也传递给你的伙伴们喔~
相关推荐:
最新新闻:
- 一行JAVA代码如何运行起来?JAVA代码运行方法
- SQL Server使用脚本实现自动备份
- NodeJS堆溢出的原因 NodeJS堆溢出解决办法
- 什么是PMI指数?PMI如何影响股市?
- 华硕电脑键盘驱动怎么重新安装?电脑键盘驱动安装方法
- SecureCRT安装及破解 SecureCRT简介
- SecureCRT知识介绍 SecureCRT怎么修改会话缓存大小?
- 怎么修改hosts文件?系统Hosts文件原理和应用
- 如何修改hosts文件?hosts文件修改方法
- 什么是Minio?如何搭建Minio集群?
- 谷歌GMS是什么?谷歌GMS概述
- 去中心化是什么意思?去中心化理由有哪些?
- 新能源汽车成为焦点!CES 2023展前新品盘点
- 环球时讯:微信红包升级:红包封面动起来了
- 环球热文:外媒曝亚马逊将大裁17000人 或是大型科技公司最大规模裁员
- 天天微资讯!国产屏崛起!郭明錤:京东方或超三星成iPhone最大的显示器供应商
- 超高刷新率!外星人推出500Hz电竞显示器|世界观天下
- 《吸血鬼:幸存者》2023年将推出更多DLC
- 毁灭者男星:《银河护卫队3》将是我最后一次饰演该角色:今日报
- 国产饮料霸主被外资「杀死」:曾年销20万吨-焦点报道
- 许鞍华回顾与汤唯合作:彼此都不满意 很遗憾
- 首发499元 限量2000套 仙剑官方竟然推出复刻版Windows 98电脑
- 观天下!LG新款Gram Ulstraslim 笔记本发布 轻至998克
- 四大系列 一分钟带来你全方位了解移动版13代酷睿|即时焦点
- 每日观察!iPhone 14 Pro产能恢复了 春节将是生产高峰
- 性能3倍于RTX 3090Ti RTX 4070Ti正式发布 6499元起-世界信息
- 【世界报资讯】Meta在欧洲再遇挫!“定向广告”被罚款超4亿美元,勒令业务模式整改
- 权游二丫本是电影版《最后的生还者》艾莉人选
- 外星人推出M18笔记本:高配24核心i9 可塞9TB硬盘|动态焦点
- 《原子之心》导演称游戏优化好 三核设备也能玩
- 微软对Win7、Win8.1停止安全更新 你受影响了吗? 天天播报
- Win11 22H2又出新Bug:文件管理器随机“突然出现”-全球热门
- 环球今日讯!苹果被爆新一代Apple Watch Ultra将配备micro-LED显示屏,或2024年推出
- CES 2023:外星人推出24.5寸500Hz IPS电竞显示器
- CES 2023:雷蛇预告灵刃系列推出16/18英寸游戏本_当前热议
- 《潜行者:切尔诺贝利阴影》虚幻5自制测试版推出 环球今头条
- 分析师:任天堂新款主机将于2024年发布:环球观焦点
- 【环球新视野】第三人称卡通风冒险《WHALIEN》1月24日登陆PC 新预告发布
- CES:ROG发布全系新品笔记本 i9处理器+4090显卡旗舰配置问鼎性能巅峰
- 猛男紫?戴尔新G15配色非常吸睛_世界观热点
- 为了多赚几个点,这批百亿私募“开年”忙出海 简讯
- 天天速读:最高正收益5%,银行权益理财去年业绩比肩百亿私募?方法出人意料
- 快看:商务部:每人每年仅可出售两辆二手车
- 郭明錤:京东方将成为iPhone 15屏幕最大供应商
- 今日上午10:00首销 摩托罗拉moto G53官网正式开售
- 6K超高分!戴尔CES展出32寸全新显示器 每日讯息
- 《浩劫前夕》PC配置公开 推荐GTX 1060
- 《守望》商城DJ皮肤引争议 玩家称其本该在通行证中_天天快消息
- 贝尔金畅销充电器产品的材料将向再生塑料过渡
- 清华团队重磅发布,发现抗体对新冠变异株XBB有效!如何防范XBB?疾控中心发声!
- 每日速读!一加11发布3999元起:2K高刷屏 12G起步
- 一加11发布:3999元 号称4年后还流畅|焦点简讯
- 《鹅鸭杀》移动端预约开启 官方正在寻找国内发行商
- 优酷回应会员仅能一部手机登录:保护账号、打击黑产
- 最新消息:放开之后,为什么坐飞机还要戴口罩?
- 今日精选:新年学会的第一件事,“排队和世界告别”
- 全球聚焦:《闪电侠》第九季发布海报 talk侠2月8日迎来最终季
- 《霍格沃茨之遗》变形咒演示 把敌人变成“只因”_热资讯
- 环球动态:香港著名作曲家顾嘉辉去世享年92岁 代表作《上海滩》
- 从1G到5G,20分钟带你回顾手机圈全部趣事-全球要闻
- 一加11搭载三星2K屏 首发随帧变动技术
- 世界百事通!优酷一个账号仅能登录一台手机,优酷回应:协议有明确规定
- 【全球新要闻】优酷会员手机App只能登录一个 国内视频平台体验变差?
- Qi2无线充电标准官宣,iPhone15充电功率有望提升
- 红米K50至尊版对比红米K60:上手后做出了选择!_速看
- 今日快讯:好玩到落泪!万代官方发布《海贼王:时光旅诗》TVCM
- 今日热搜:韩国全球排名力压日本 让韩网友兴奋:日本网友吐槽除了三星还有啥
- 全球即时看!贾跃亭的法拉第未来重返2023年CES FF91完成升级
- 2022年度回顾:市场动荡之年,哪类资产笑到了最后?
- 脑中之脑:当动物脑中移植了人类神经元 每日动态
- 投资机构,不再轻易打款了-最新快讯
- 每日讯息!摩托罗拉ThinkPhone在CES 2023官宣,保留经典小红点
- 3999 元起,一加 11 正式发布:搭载骁龙 8 Gen 2,12GB+256GB 起步
- 年货节苏宁宜品入驻家乐福、零售云,春节假期不打烊
- 真无线耳机音质代表作 真香旗舰一加 Buds Pro 2发布