博舍

Java代码为什么要在虚拟机中运行 java可以在任何机器上运行吗为什么

Java代码为什么要在虚拟机中运行

写在前面

本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见100个问题搞定Java虚拟机

解答1.JVM提供了跨平台的特性2.JVM提供了自动内存管理与垃圾回收的能力3.JVM提供了诸如数组越界、动态类型、安全权限等的动态检测能力补充跨平台

Java作为一门高级程序语言,它的语法复杂,抽象程度较高,直接在硬件上运行Java会使得Java程序员纠缠在不同硬件的适配开发中。所以,为了更方便的实现可移植性,Java的创造者(JamesGosling等)引入了一个面向Java语言特性的虚拟机,通过编译器将Java程序转换成该虚拟机所能识别的指令序列,即Java字节码。

通过Java字节码这个中间层表示,只需要根据不同平台提供不同的虚拟机实现,即可实现C开发人员"梦寐以求"的"一次编写,到处运行"。

托管环境

虚拟机带来了一个托管环境(ManagedRuntime)。这个托管环境能够代替我们处理一些代码中冗长而且容易出错的部分。其中最广为人知的就是自动内存管理与垃圾回收,这使得Java程序员从繁琐且易错的内存分配回收逻辑中脱离出来,专注于业务开发。

当然,这也有弊端,虚拟机毕竟不是真正的业务技术专家,无法准确的根据实际需求来分配回收内存,只能使用通用的算法,而且由于JVM向Java程序员承诺了不需要管理内存,这也会使得部分Java程序员把内存管理完全交给了默认配置的JVM,这会导致更多诸如OOM,频繁FullGC等问题的出现。

现在更多的大数据框架比如Spark,Flink等都选择使用直接内存避免JVM自动管理内存,这在提升性能上会带来更大的收益。

动态检测

托管环境提供了诸如数组越界、动态类型、安全权限等等的动态检测,使我们免于书写这些无关业务逻辑的代码。

如何让你的java程序可以在任何机器上单击运行

  如何让你的java程序可以在任何机器上单击运行    在安装好了JRE的机器上的任何一个目录下都可以执行java.exe。因为它在安装时被复制到了windows的system32目录下,而后者无论如何都会在path环境变量中。这个java.exe

   最终必然会访问注册表来确定真正的JRE的所在地。如果我们没有安装JRE而只是安装了jdk那么我们就需要设定环境变量,当环境变量设定好了之后,我们就可以在任意目录下执行 javac.exe或java.exe。若我们要求每一个应用程序都自带JRE,这两种办法都不行。但,java.exe会在它的父目录下查找JRE。

   假设我们的应用程序打好了包,叫做JavaApplication.jar,放在JavaCode的目录下。我们在JavaCode目录下,可以执行java-jarJavaApplication.jar来运行我们的程序。

   我们安装的JRE在d:Javajre1.5.0下。现在,我们只需要将jre1.5.0目录复制到JavaCode目录下,改个比较容易写的名字比如叫jre。现在,JavaCode目录中有如下的内容:JavaCode:        JavaApplication.jar        Jre:           Jre1.5.0目录下的全部内容(不包括Jre1.5.0目录本身,主要包括其中的bin目录和lib目录)

   Java.exe就在jre目录下的bin目录中。java.exe会在它的父目录中查找jre,实验证实,它会查找lib目录,而lib就在jre目录下。因此,这样java.exe就会确定jre的所在然后正常

   执行java程序,不会去管我们是否安装了JRE,注册表中是否有注册项这些杂事了。

   检查一下是否使用了JavaCode目录下的JRE    运行cmd在命令行下进入JavaCode的目录(假设它在E盘),将path指向JavaCode下的JRE:   setpath=e:JavaCodejrein

  java-verbose-jarJavaApplication.jar

 

  JRE1.5有70MB作为私有JRE显然太大了,但其中好多内容都是可以不要的。Jre目录下的license都可以不要,bin下的执行文件只需要保留java.exe或者javaw.exe,lib下只要

   保留rt,jsse,jce,charsets几个库就可以了。除了i386和zi两个子目录外,其余的子目录都可以不要。Zi下只需要保留自己地区的子目录和其下的一些文件就可以。Lib下除了

   库之外的属性文件等等都要保留。每次清理调一些不要的内容都要运行几遍我们的应用程序,以确保我们的JRE不缺少东西。

   如果我们希望能像VC等一样有的.exe文件可以直接直接启动我们的应用程序,那么最简单的方法是写一个P处理教本。     在一个.txt文件中比如说Autotun.txt像这样写:           setpath=..jrein           java-jarJavaApplication.jar

   这样在Java程序启动时,加载的DOS窗口一直出现,直到你关闭了Java程序才一起关闭。如果你想在运行你的程序时避免这个DOS窗口可以这样写:              startjavaw-jarJavaApplication.jar

   DOS窗口还是会一闪而过,因为javaw是一个需要dos加载的命令。

   然后这个.txt文件的后缀txt改成bat或cmd。最后将这个脚本Autotun.bat或Autotun.cmd放在JavaCode目录下即可

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇