java概述_java技术介绍-程序员宅基地

技术标签: JVM  java  开发语言  

一、java概述

        java语言是SUN(Stanford University Network,斯坦福大学网络公司 ) 1995年推出的一门高级编程语言,是一种面向Internet的编程语言。

        Java一开始富有吸引力是因为Java程序可以在Web浏览器中运行。这些Java程序被称为Java小程序(applet)。applet使用现代的图形用户界面与Web用户进行交互。 applet内嵌在HTML代码中。

        随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。

二、java的特性

2.1、Java的跨平台性

        我们知道java有跨平台的特性,即一次编译处处运行,其实质是jvm在编译java代码时,会将代码编译成.class的字节码文件,只要在不同的环境中安装对应的JDK(其中包含jvm),我们就可以运行程序了。

        其实java虚拟机不仅可以支持java语言,对于其他语言,我们都可以通过把它转换成字节码文件,最后转换的字节码文件都能通过Java虚拟机进行运行和处理。随着Java7的正式发布,Java虚拟机的设计者们通过JSR-292规范基本实现在Java虚拟机平台上运行非Java语言编写的程序。

        Java虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,它只关心“字节码”文件。也就是说Java虚拟机拥有语言无关性,并不会单纯地与Java语言“终身绑定”,只要其他编程语言的编译结果满足并包含Java虚拟机的内部指令集、符号表以及其他的辅助信息,它就是一个有效的字节码文件,就能够被虚拟机所识别并装载运行。

2.2、字节码

        我们平时说的java字节码,指的是用java语言编译成的字节码。准确的说任何能在jvm平台上执行的字节码格式都是一样的。所以应该统称为:jvm字节码。

        不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同的JVM上运行。Java虚拟机与Java语言并没有必然的联系,它只与特定的二进制文件格式——Class文件格式所关联,Class文件中包含了Java虚拟机指令集(或者称为字节码、Bytecodes)和符号表,还有一些其他辅助信息。

2.3、JDK、JRE、JVM之间的关系

        JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。
        JRE(Java Runtime Environment)是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。
        JVM(Java Virtual Machine)是java虚拟机的缩写,是整个java实现跨平台的最核心的部分,能够运行以Java语言写作的软件程序。

 

三、java的发展史 

  • 1995年5月23日,Oak语言改名为Java,并且在SunWorld大会上正式发布Java 1.0版本。Java语言第一次提出了“Write Once,Run Anywhere”的口号。
  • 1999年4月27日,HotSpot虚拟机诞生。HotSpot虚拟机刚发布时是作为JDK 1.2的附加程序提供的,后来它成为JDK 1.3及之后所有JDK版本的默认Java虚拟机。
  • 2004年9月30日,JDK 5发布,工程代号为Tiger(老虎),是Java语言的发展史上的又一里程碑事件。JDK的版本不再是“1.x”的命名方式,而采用“JDK x”方式进行命名。
  • JDK 8的第一个正式版本于2014年3月18日发布,从JDK 8开始,Oracle启用JEP(JDK Enhancement Proposals)来定义和管理纳入新版JDK发布范围的功能特性。
  •         JEP 126:对Lambda表达式的支持,这让Java语言拥有了流畅的函数式表达能力。
  •         JEP 104:内置Nashorn JavaScript引擎的支持,成为Java的嵌入式JavaScript引擎。
  •         JEP 150:新的时间、日期API。
  •         JEP 122:彻底移除HotSpot的永久代。
  •         ……
  • JDK9于2017年9月21日发布。JDK 9发布后,Oracle随即宣布Java将会以持续交付的形式和更加敏捷的研发节奏向前推进,以后JDK将会在每年的3月和9月各发布一个大版本。每六个JDK大版本中才会被划出一个长期支持(Long Term Support,LTS)版,只有LTS版的JDK能够获得为期三年的支持和更新,普通版的JDK就只有短短六个月的生命周期。JDK 8和JDK 11是LTS版,再下一个就到2021年发布的JDK 17了。
  • 2018年3月20日,JDK 10如期发布,这版本的主要研发目标是内部重构,诸如统一源仓库、统一垃圾收集器接口、统一即时编译器接口等,这些都将会是对未来Java发展大有裨益的改进。
  • 2018年9月25日,JDK 11发布,这是一个LTS版本的JDK,包含17个JEP,其中有ZGC这样的革命性的垃圾收集器出现,也有把JDK 10中的类型推断加入Lambda语法这种可见的改进。
  • 2019年2月,在JDK 12发布前夕,Oracle果然如之前宣布那样在六个月之后就放弃了对上一个版本OpenJDK的维护,RedHat同时从Oracle手上接过OpenJDK 8和OpenJDK 11的管理权利和维护职责。
  • 2019年3月20日,JDK 12发布,只包含8个JEP,其中主要有Switch表达式、Java微测试套件(JMH)等新功能,最引人注目的特性无疑是加入了由RedHat领导开发的Shenandoah垃圾收集器。Shenandoah作为首个由非Oracle开发的垃圾收集器,其目标又与Oracle在JDK 11中发布的ZGC几乎完全一致,两者天生就存在竞争。Oracle马上用实际行动抵制了这个新收集器,在JDK 11发布时才说应尽可能保证OracleJDK和OpenJDK的兼容一致,转眼就在OracleJDK 12里把Shenandoah的代码通过条件编译强行剔除掉,使其成为历史上唯一进入了OpenJDK发布清单,但在OracleJDK中无法使用的功能。
  • 2020年 3 月 17 日,JDK14 正式 GA(General Available),新增了Records、switch表达式(JDK 12和JDK 13中的预览特性,现在正式使用)、文本块等新特性。在JVM方面,弃用Parallel Scavenge和SerialOld GC组合、删除CMS垃圾回收器。

 四、各种JVM

        Java虚拟机是java运行的基石,不同的虚拟机对于java运行有着非常重要的影响,我们熟知的虚拟机有HotSpot、JRockit还有IBM J9虚拟机,在java发展史中除了这三个知名的虚拟机外,还有一些其他的虚拟机,下面我们一起来了解下。

4.1、Classic VM

        1996年1月23日,Sun发布JDK 1.0,世界上第一款商用Java虚拟机Classic VM发布。这款虚拟机只能使用纯解释器方式来执行Java代码,如果要使用即时编译器那就必须进行外挂,但是假如外挂了即时编译器的话,即时编译器就会完全接管虚拟机的执行系统,解释器便不能再工作了。

4.2、Exact VM

        在JDK 1.2时,曾在Solaris平台上发布过一款名为Exact VM的虚拟机,它的编译执行系统已经具备现代高性能虚拟机雏形,如热点探测、两级即时编译器、编译器与解释器混合工作模式等。
虽然Exact VM的技术相对Classic VM来说先进了许多,但是它的命运显得十分英雄气短,在商业应用上只存在了很短暂的时间就被外部引进的HotSpot VM所取代,甚至还没有来得及发Windows和Linux平台下的商用版本。

4.3、HotSpot VM

        HotSpot VM 是Sun/OracleJDK和OpenJDK中的默认Java虚拟机,也是目前使用范围最广的Java虚拟机。在最初并非由Sun公司所开发,而是由一家名为“Longview Technologies”的小公司设计的。HotSpot既继承了Sun之前两款商用虚拟机的优点,也有许多自己新的技术优势,如它名称中的HotSpot指的就是它的热点代码探测技术。

        2006年,Sun陆续将SunJDK的各个部分在GPLv2协议下开放了源码,形成了Open-JDK项目,其中当然也包括HotSpot虚拟机。HotSpot从此成为Sun/OracleJDK和OpenJDK两个实现极度接近的JDK项目的共同虚拟机。

        Oracle收购Sun以后,建立了HotRockit项目来把原来BEA JRockit中的优秀特性融合到HotSpot之中。到了2014年的JDK 8时期,里面的HotSpot就已是两者融合的结果,HotSpot在这个过程里移除掉永久代,吸收了JRockit的Java Mission Control监控工具等功能。

4.4、BEA JRockit JVM

        JRockit虚拟机曾经号称是“世界上速度最快的Java虚拟机”,它是BEA在2002年从Appeal Virtual Machines公司收购获得的Java虚拟机。BEA将其发展为一款专门为服务器硬件和服务端应用场景高度优化的虚拟机,由于专注于服务端应用,它可以不太关注于程序启动速度,因此JRockit内部不包含解释器实现,全部代码都靠即时编译器编译后执行。

        除此之外,JRockit的垃圾收集器和Java Mission Control故障处理套件等部分的实现,在当时众多的Java虚拟机中也处于领先水平。JRockit随着BEA被Oracle收购,现已不再继续发展,永远停留在R28版本,这是JDK 6版JRockit的代号。 

4.5、IBM J9 VM

        IBM J9虚拟机并不是IBM公司唯一的Java虚拟机,不过目前IBM主力发展无疑就是J9。
与BEA JRockit只专注于服务端应用不同,IBM J9虚拟机的市场定位与HotSpot比较接近,它是一款在设计上全面考虑服务端、桌面应用,再到嵌入式的多用途虚拟机。
        开发J9的目的是作为IBM公司各种Java产品的执行平台,在和IBM产品(如IBM WebSphere等)搭配以及在IBM AIX和z/OS这些平台上部署Java应用。
        从2016年起,IBM逐步将OMR项目和J9虚拟机进行开源,完全开源后便将它们捐献给了Eclipse基金会管理,并重新命名为Eclipse OMR和OpenJ9。

4.6、Apache Harmony VM

        Apache Harmony是一个Apache软件基金会旗下以Apache License协议开源的实际兼容于JDK 5和JDK 6的Java程序运行平台,它含有自己的虚拟机和Java类库API,用户可以在上面运行Eclipse、Tomcat、Maven等常用的Java程序。但是,它并没有通过TCK(Technology Compatibility Kit)认证。
        当Sun公司把自家的JDK开源形成OpenJDK项目之后,Apache Harmony开源的优势被极大地抵消,以至于连Harmony项目的最大参与者IBM公司也宣布辞去Harmony项目管理主席的职位,转而参与OpenJDK的开发。虽然Harmony没有真正地被大规模商业运用过,但是它的许多代码(主要是Java类库部分的代码)被吸纳进IBM的JDK 7实现以及Google Android SDK之中,尤其是对Android的发展起了很大推动作用。

4.7、Microsoft JVM

        在Java语言诞生的初期,它的主要应用之一是在浏览器中运行Java Applets程序,微软为了在Internet Explorer 3浏览器中支持Java Applets应用而开发了自己的Java虚拟机,虽然这款虚拟机只有Windows平台的版本,“一次编译,到处运行”根本无从谈起,但却是当时Windows系统下性能最好的Java虚拟机。
        在1997年10月,Sun公司正式以侵犯商标、不正当竞争等罪名控告微软,在随后对微软公司的垄断调查之中,这款虚拟机也曾作为证据之一被呈送法庭。官司的结果是微软向Sun公司(最终微软因垄断赔偿给Sun公司的总金额高达10亿美元)赔偿2000万美金,承诺终止其Java虚拟机的发展,并逐步在产品中移除Java虚拟机相关功能。

4.8、Graal VM

        2018年4月,Oracle Labs新公开了一项黑科技:Graal VM,从它的口号“Run Programs Faster Anywhere”就能感觉到一颗蓬勃的野心。Graal VM 是一个在HotSpot虚拟机基础上增强而成的跨语言全栈虚拟机,可以作为“任何语言”的运行平台使用,这里“任何语言”包括了Java、Scala、Groovy、Kotlin等基于Java虚拟机之上的语言,还包括了C、C++、Rust等基于LLVM的语言,同时支持其他像JavaScript、Ruby、Python和R语言等。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43418737/article/details/124949101

智能推荐

PHP生成日期序列_php组件生成日期自增数字-程序员宅基地

文章浏览阅读1k次。<?php$d0 = '2010-04-20';$d1 = '2010-04-23'; $_time = range(strtotime($d0), strtotime($d1), 24*60*60);$_time = array_map(create_function('$v', 'return date("Y-m-d", $v);'), $_time);print_..._php组件生成日期自增数字

JFreeChart简介及下载、配置-程序员宅基地

文章浏览阅读686次。JFreeChart简介JFreeChart是完全基于Java语言的开源项目,因此可以使用在Java开发环境中,包括Java应用程序,或者是Java Web应用都没有任何问题。结合iText项目,可将生成的统计图表输出到PDF文件中;结合最新的POI项目,也可以将生成的统计图表输出到Excel文档中。JFreeChart可用于生成各式各样的统计图表,只要开发人员提供符合JFreeCha..._jfreechart依赖下载

cpu_detected cpu family 6 model 106-程序员宅基地

文章浏览阅读592次。————监控系统的状态————1.查看当前系统的负载 w命令[root@localhost ~]# w11:41:05 up 1:42, 2 users, load average: 0.00, 0.01, 0.05USER TTY FROM LOGIN@ IDLE JCPU PCPU WHATroot tty1 18:07 ? 0.41s 0.41s ..._detected cpu family 6 model 106

Java Swing JTable 表格【7:监听表格数据变化】_jtable监听-程序员宅基地

文章浏览阅读1.6w次,点赞11次,收藏51次。监听表格数据变化 终于进入到JTable的重头戏了,监听在任何Java项目中都是非常重要的,监听带来的一系列的操作也有时候非常复杂 在Excel表格中,当表格中的一个单元格的数据发生变化时,与之相关的数据也会同时发生变化,这就设计到表格监听器的知识。JTable的事件大致均针对表格内容的操作处理,包括字段内容改变、列数增加或减少、行数增加或减少、表格的结构改变等。这些事件称为Table_jtable监听

CSS选择器权重问题_分组选择器权重单独计算-程序员宅基地

文章浏览阅读214次,点赞14次,收藏10次。摘要:关于css选择器权重问题_分组选择器权重单独计算

zeppelin集成openldap,以及admin用户设置_zeppelin能建账号吗-程序员宅基地

文章浏览阅读2.2k次。之前写过一篇文章集成FreeIPA,今天尝试集成OpenLdap,出现了一些问题,这里记录下配置过程修改zeppelin-site.xml<property> <name>zeppelin.anonymous.allowed</name> <value>false</value> <description>An..._zeppelin能建账号吗

随便推点

基于高德地图api的热力图配置及显示调优_热力图颜色梯度-程序员宅基地

文章浏览阅读1.3w次,点赞6次,收藏47次。基于高德地图api的热力图配置及显示调优缘起使用热力图的基本配置加载js组件和数据加载组件加载数据重要参数说明显示调优rediusmax参考缘起领导要求根据公交订单的起点/终点数据,来展示用户下单的起点/终点的分布情况,这时用热力图来表示分布情况更加直观。在使用高德地图热力图api的过程中,被几个参数折磨到凌晨2点多,将经验总结如下。使用热力图的基本配置在热力图api实例中有标准代码。..._热力图颜色梯度

MySQL——习题:每个部门当前员工最高薪水_mysql每个部门的最高工资的语句-程序员宅基地

文章浏览阅读512次。有一个员工表dept_emp简况如下:有一个薪水表salaries简况如下:获取所有部门中员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary,按照部门编号升序排列,以上例子输出如下:解法1:SELECT d1.dept_no, d1.emp_no, s1.salaryFROM dept_emp as d1INNER JOIN salaries as s1ON d1.emp_no=s1.emp_noAND d1.to_date='9999-01-01'A_mysql每个部门的最高工资的语句

The constructor Service(URL, QName, WebServiceFeature[]) is undefined-程序员宅基地

文章浏览阅读697次。Service(URL, QName, WebServiceFeature[]) is undefined 原因是CXF自带的javax.xml.service 版本高过 jdk的javax.xml.service。 一个解决办法是: 在使用wsdl2java时,加入参数 -frontend jaxws21 这个问题的消息解释可以在这里看到 : http://david-commerce.itey..._the constructor service(url, qname, webservicefeature[]) is undefined

eq(equal)等于,ne neq(not equal)不等于,gt(greater than)大于 (smarty)_eq等于-程序员宅基地

文章浏览阅读1w次。eq相等 ne、neq不相等, gt大于, lt小于 gte、ge大于等于 lte、le 小于等于 not非 mod求模 is [not] div by是否能被某数整除 is [not] even是否为偶数 is [not] even by $b即($a / $b) % 2 == 0 is [not] odd是否为奇 is not odd by $b即($a _eq等于

centos8使用war包安装部署jenkins以及初始化配置_centos 8 jenkins.war启动-程序员宅基地

文章浏览阅读1.4k次,点赞4次,收藏3次。centos8使用war包安装部署jenkins以及初始化配置准备工作安装jdk并配置环境变量安装maven并配置环境变量先检查是否安装maven安装maven创建目录下载解压移动配置环境变量检查是否安装成功配置maven国内镜像安装git使用dnf安装git检查版本安装tomcat并设置为开机自启动创建目录下载解压移动至/usr/local/tomcat目录下启动加入systemctl管理并设置为开机自启动修改catalina.sh文件创建tomcat服务文件重载服务列表启动tomcat服务tomcat设_centos 8 jenkins.war启动

Unity 通过LineRenderer绘制两点之间的直线_line.material = new material(shader.find("particle-程序员宅基地

文章浏览阅读2.7w次,点赞5次,收藏43次。private LineRenderer line;//画线line = this.gameObject.AddComponent();//只有设置了材质 setColor才有作用line.material = new Material(Shader.Find("Particles/Additive"));line.SetVertexCount(2);//设置两_line.material = new material(shader.find("particles/additive"));

推荐文章

热门文章

相关标签