安装好的java虚拟机主要包括哪些部分?他们的主要功能是什么?
看了一些专门介绍java核心机的书,大概明白虚拟机是一个模拟真实机器软件,但很多概念看起来很晦涩,没有一个直观的感受。能不能从安装目录下的文件入手,介绍一下那些‘文件’及...
看了一些专门介绍java核心机的书,大概明白虚拟机是一个模拟真实机器软件,但很多概念看起来很晦涩,没有一个直观的感受。能不能从安装目录下的文件入手,介绍一下那些‘文件’及‘文件夹’主要的功能是什么?(安装目录下除了bin文件夹下的那些可执行文件以外还有很多其他文件和文件夹,能否从java虚拟机的工作原理的角度出发做一些介绍?)谢谢了。
展开
展开全部
如你所说,java虚拟机是一个模拟真实机器的软件,其实java虚拟机就是bin目录下那个java.exe文件(我们执行一个java程序时要使用java命令就是执行这个程序,然后由它解释执行java程序)。
java虚拟机定义了很多指令,就像一个真正的机器的硬件一样,字节码通过这些指令操作java虚拟机,然后java虚拟机再将这些指令翻译为硬件指令。基本原理就是这样。
我想你迷惑的是java虚拟机是怎样执行一个java文件的对吧?
假设我们编写了一个java程序,编译后生成的字节码文件是Test.class,那么我们通常是这么运行我们的java程序的:
java Test
上面的命令的本意是“启动java.exe程序(即java虚拟机),并将"Test"这个字符串参数传递给它”(这一点了解DOS命令执行原理的人很容易理解)。
然后,操作系统会启动java.exe,它首先取得参数"Test",然后再传递给ClassLoader类(这个类在java.lang包中,当需要载入类时就会用到它),ClassLoader类查找classpath环境变量中指定的目录,如果没有定义classpath则默认为当前目录,在其中寻找"Test.class",.class后缀是自动加上去的,因此我们执行java程序时不能写成java Test.class,这样是找不到的(即使有Test.class.class文件也不行,因为此时的.号有另外的含义,它是包分隔符,因此这种情况下ClassLoader实际上找的是Test目录下的class.class文件)。
找到后,就将它载入java虚拟机,其实就是读取其中的二进制字节码,java虚拟机对它载入的类的字节码有很严格的要求,它首先检查这个文件中的字节码是否符合标准格式(这个检查是java虚拟机自己完成的,事实上,对字节码进行检查的规则有严格的定义,详见《java虚拟机规范》),检查没有问题后(如果我们用的是sun自己的编译器,并且我们没有改动过字节码文件,那么这个检查肯定是没有问题的,依照《java虚拟机规范》的解释,检查的目的是为了保持字节码的完整性,其实就是说担心其它人会改动字节码或其它编译器生成的字节码不符合规范)。
我们可以把编译后的字节码看成一条条指令和数据定义(就像汇编语言一样)。当前一步的检查通过后,java虚拟机开始真正载入这个类(检查阶段只是把这个类当成一个二进制格式的文本文件,并不是把它当作一个虚拟机可执行的程序)。在这个阶段,java虚拟机负责为类的数据分配内存,例如将数据装入常数池,将类的方法定义装入内存堆(池和堆是java虚拟机管理内存的逻辑单元,所有数据都在池中,所有可执行代码都在堆中,在需要时再将其取出并压入堆栈——不明白的话这一点可以略过)。
然后就是从这个类的入口函数(即main方法)开始执行:读取一条指令 > 翻译指令 > 执行指令 > 再读取下一条指令 > ......如此循环
(一般情况下是这样,但如果在执行过程中JIT,即java运行时系统将其中经常用到的一些指令编译为机器语言的话,再执行这些指令时就不需要翻译了——再罗嗦几句:尽管现在的java程序执行速度还不尽人意,但理论上,JIT系统可能会获得比C还要高的效率,因为编译后C的代码是死的,而JIT是在运行时编译,在这种情况下,容易知道哪些代码经常被使用,进而知道如何最大可能地优化这些代码,类似C语言的编译器在静态情况下是无法做到的)。
java虚拟机定义了很多指令,就像一个真正的机器的硬件一样,字节码通过这些指令操作java虚拟机,然后java虚拟机再将这些指令翻译为硬件指令。基本原理就是这样。
我想你迷惑的是java虚拟机是怎样执行一个java文件的对吧?
假设我们编写了一个java程序,编译后生成的字节码文件是Test.class,那么我们通常是这么运行我们的java程序的:
java Test
上面的命令的本意是“启动java.exe程序(即java虚拟机),并将"Test"这个字符串参数传递给它”(这一点了解DOS命令执行原理的人很容易理解)。
然后,操作系统会启动java.exe,它首先取得参数"Test",然后再传递给ClassLoader类(这个类在java.lang包中,当需要载入类时就会用到它),ClassLoader类查找classpath环境变量中指定的目录,如果没有定义classpath则默认为当前目录,在其中寻找"Test.class",.class后缀是自动加上去的,因此我们执行java程序时不能写成java Test.class,这样是找不到的(即使有Test.class.class文件也不行,因为此时的.号有另外的含义,它是包分隔符,因此这种情况下ClassLoader实际上找的是Test目录下的class.class文件)。
找到后,就将它载入java虚拟机,其实就是读取其中的二进制字节码,java虚拟机对它载入的类的字节码有很严格的要求,它首先检查这个文件中的字节码是否符合标准格式(这个检查是java虚拟机自己完成的,事实上,对字节码进行检查的规则有严格的定义,详见《java虚拟机规范》),检查没有问题后(如果我们用的是sun自己的编译器,并且我们没有改动过字节码文件,那么这个检查肯定是没有问题的,依照《java虚拟机规范》的解释,检查的目的是为了保持字节码的完整性,其实就是说担心其它人会改动字节码或其它编译器生成的字节码不符合规范)。
我们可以把编译后的字节码看成一条条指令和数据定义(就像汇编语言一样)。当前一步的检查通过后,java虚拟机开始真正载入这个类(检查阶段只是把这个类当成一个二进制格式的文本文件,并不是把它当作一个虚拟机可执行的程序)。在这个阶段,java虚拟机负责为类的数据分配内存,例如将数据装入常数池,将类的方法定义装入内存堆(池和堆是java虚拟机管理内存的逻辑单元,所有数据都在池中,所有可执行代码都在堆中,在需要时再将其取出并压入堆栈——不明白的话这一点可以略过)。
然后就是从这个类的入口函数(即main方法)开始执行:读取一条指令 > 翻译指令 > 执行指令 > 再读取下一条指令 > ......如此循环
(一般情况下是这样,但如果在执行过程中JIT,即java运行时系统将其中经常用到的一些指令编译为机器语言的话,再执行这些指令时就不需要翻译了——再罗嗦几句:尽管现在的java程序执行速度还不尽人意,但理论上,JIT系统可能会获得比C还要高的效率,因为编译后C的代码是死的,而JIT是在运行时编译,在这种情况下,容易知道哪些代码经常被使用,进而知道如何最大可能地优化这些代码,类似C语言的编译器在静态情况下是无法做到的)。
华北工控
2018-08-21 广告
2018-08-21 广告
工控机国内比较好的品牌有华北工控,性价比和质量都比较过硬。华北工控是一家二十多年专业从事工控机研发和制造的高新技术企业,产品质量稳定,全国联保,可提供全套产品解决方案。华北工控 工控机,多串口高性能可解决各种复杂环境要求持久稳定运行。具体产...
点击进入详情页
本回答由华北工控提供
展开全部
Java安装后JDK/bin目录下的众多exe文件的用途
bin目录
提供的是JDK的工具程序,包括javac、java、javadoc、appletviewer等程序。
demo目录
一些使用Java编写好的范例程序。
jre目录
JDK自己附带的JRE。
lib目录
工具程序实际上会使用的Java工具类(例如,javac工具程序实际上会去使用tools.jar中的com/sun/tools/javac/Main类)。
src.zip
Java提供的API类的源代码压缩文件。如果将来需要查看API的某些功能是如何实现的,可以查看这个文件中的源代码内容。
javac:Java编译器,将Java源代码换成字节代
java:Java解释器,直接从类文件执行Java应用程序代码
appletviewer(小程序浏览器):一种执行HTML文件上的Java小程序类的Java浏览器
javadoc:根据Java源代码及其说明语句生成的HTML文档
jdb:Java调试器,可以逐行地执行程序、设置断点和检查变量
javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件
Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义
jar:多用途的存档及压缩工具,是个java应用程序,可将多个文件合并为单个JAR归档文件。
htmlConverter——命令转换工具。
native2ascii——将含有不是Unicode或Latinl字符的的文件转换为Unicode编码字符的文件。
serialver——返回serialverUID。语法:serialver [show] 命令选项show是用来显示一个简单的界面。输入完整的类名按Enter键或"显示"按钮,可显示serialverUID。
java虚拟机原理:http://blog.csdn.net/kingswood/archive/2008/02/18/2103498.aspx
最后要是想给你个建议:对于你而言,我想有必要建议你看这本书:java 深度历险!看过我想你应该回收获不小!呵呵
bin目录
提供的是JDK的工具程序,包括javac、java、javadoc、appletviewer等程序。
demo目录
一些使用Java编写好的范例程序。
jre目录
JDK自己附带的JRE。
lib目录
工具程序实际上会使用的Java工具类(例如,javac工具程序实际上会去使用tools.jar中的com/sun/tools/javac/Main类)。
src.zip
Java提供的API类的源代码压缩文件。如果将来需要查看API的某些功能是如何实现的,可以查看这个文件中的源代码内容。
javac:Java编译器,将Java源代码换成字节代
java:Java解释器,直接从类文件执行Java应用程序代码
appletviewer(小程序浏览器):一种执行HTML文件上的Java小程序类的Java浏览器
javadoc:根据Java源代码及其说明语句生成的HTML文档
jdb:Java调试器,可以逐行地执行程序、设置断点和检查变量
javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件
Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义
jar:多用途的存档及压缩工具,是个java应用程序,可将多个文件合并为单个JAR归档文件。
htmlConverter——命令转换工具。
native2ascii——将含有不是Unicode或Latinl字符的的文件转换为Unicode编码字符的文件。
serialver——返回serialverUID。语法:serialver [show] 命令选项show是用来显示一个简单的界面。输入完整的类名按Enter键或"显示"按钮,可显示serialverUID。
java虚拟机原理:http://blog.csdn.net/kingswood/archive/2008/02/18/2103498.aspx
最后要是想给你个建议:对于你而言,我想有必要建议你看这本书:java 深度历险!看过我想你应该回收获不小!呵呵
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果你正开始学习java,建议你不要学这些东西,还是从基础代码学起。
java的虚拟机并不是一个模拟真实机器软件喔。它是用来处理java代码编译后的二进制码的。
java的虚拟机并不是一个模拟真实机器软件喔。它是用来处理java代码编译后的二进制码的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的概念有错误啊!你装的那个不叫java虚拟机!java虚拟机不是单独存在的,它是内嵌在jre里边的!你装的jdk!
http://www.china-pub.com/937076
这个JDK的详细图文介绍,你如果真的感兴趣请坚持下去好好学习吧!
http://www.china-pub.com/937076
这个JDK的详细图文介绍,你如果真的感兴趣请坚持下去好好学习吧!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询