java 溯本求源之基础(一)

前言

本文章需要有一定的java基础,并不是完全的基础,写该系类只是为了让刚入门的朋友能在想干什么时候能够想到,有一个思路,本系类是以jdk8进行更新的,后续会以jdk11和jdk17为系列进行更新。

话不多说,本次介绍的是该图(图1)的第一行的第一个,也就是java。

​编辑

图一

那么这里的java工具指的就是当我们安装好了我们的环境变量之后,bin目录下的工具,该图(图2)为笔者jdk,bin目录下的截图。java 这个工具是我本最常见的使用方式了,但是本次介绍依旧要不厌其烦的介绍一下

​编辑

图二

1.java tool

当我们输入控制台或者commod输入java的时候, 操作系统首先会查找环境变量PATH中指定的目录,以寻找与输入的命令(java)相关联的可执行文件。当找到我们输入的相关的可执行文件的时候,那么此时就会执行java并输出(图三)的格式。​编辑

图三

比如我们常用的java -version ,因为是基础,那么笔者会在这里都进行解释。

1.2 java -version

可以看到java -version 的介绍为输出版本并退出,它等同于 java -showversion 只不过showversion会继续等待命令,那么相关输出参数是什么意思呢。我在下方已经备注

java 复制代码
➜  bin java -version
openjdk version "1.8.0_345"   (该行为我们所使用的jdk版本,也是我们最长关注的)
OpenJDK Runtime Environment (build 1.8.0_345-b01) (该行为jdk运行时的详细环境信息,如果你的是SE那么他表示标准版的(Standard Edition))
OpenJDK 64-Bit Server VM (build 25.345-b01, mixed mode) (该行表示的是java虚拟机信息,这里输出的是一个 64位的服务器虚拟机,并且它同时支持解释执行和即时编译执行(mixed mode)) 同样有服务器虚拟机就会有客户客户端虚拟机 (相应的我们这里就顺便介绍了 java -server 命令)

其他扩充:

客户端虚拟机(Client VM)主要关注启动速度和内存占用,因此通常在桌面应用程序和客户端应用程序中使用。以下是一些情况和场景,其中使用客户端虚拟机可能更为合适:

  1. 桌面应用程序:

    • 桌面应用程序通常需要快速启动以提供良好的用户体验。Client VM在这种情况下可能更适用,因为它更注重启动性能。
  2. 交互式应用程序:

    • 如果应用程序需要频繁响应用户交互,并且对启动速度敏感,那么选择Client VM可能更合适。这包括一些图形界面(GUI)应用程序或交互式工具。
  3. 内存受限环境:

    • 在内存受限的环境中,例如嵌入式系统或移动设备,Client VM可以在减少内存占用方面表现得更好。这对于资源有限的设备来说是一个重要考虑因素。
  4. 短期执行任务:

    • 如果应用程序是一次性任务或短期运行的小型应用,而不是长时间运行的服务,那么Client VM的性能特性可能更符合需求。

值得注意的是,随着Java虚拟机的不断发展,一些传统上与Client VM相关的性能差异正在减小,而Server VM在许多方面已经变得更加灵活和适用于各种场景。因此,对于许多应用程序而言,默认使用Server VM可能是一个更合理的选择。在选择虚拟机模式时,最好通过测试和性能分析来确定哪种模式最符合你的应用程序的需求。

1.3 java -d32 以及 java -d64

使用-d32选项指定32位Java虚拟机启动时,主要是影响了整体的虚拟机的位数。这意味着虚拟机本身是32位的。

使用java -d32可以影响Java应用程序在以下几个方面:

  1. 内存限制: 32位Java虚拟机通常有较小的内存寻址空间限制,通常在2GB到4GB之间,这是由32位系统的寻址架构所决定的。因此,使用32位Java虚拟机可能会受到内存限制,对于需要大量内存的应用程序可能不够适用。
  2. 性能: 64位系统上的64位Java虚拟机通常能够更好地利用大于4GB的内存,提供更好的性能。在一些场景下,使用32位Java虚拟机可能导致性能下降,尤其是在需要处理大量数据的情况下。
  3. 依赖性: 一些老旧或特殊的Java库和应用程序可能仅支持32位Java虚拟机。在这种情况下,使用java -d32可以确保你的应用程序能够正常运行。
  4. 兼容性: 一些特殊情况下,特定的本地库、第三方库或系统集成可能对32位Java有一些依赖性。通过使用32位Java虚拟机,你可以确保与这些组件的兼容性。

需要注意的是,在现代计算环境中,大多数应用程序和库都已经过渡到64位支持,并且默认情况下Java虚拟机会选择与操作系统位数匹配的版本。因此,显式地使用-d32选项通常是在面对特殊的兼容性需求或特殊环境时才会考虑的事项。

1.4 java -server

以下是官网原文介绍,喜欢原汁原味儿的铁子可以看英文
vbnet 复制代码
Starting with Java SE 5.0, when an application starts up, the launcher can attempt to detect whether the application is running on a "server-class" machine and, if so, use the Java HotSpot Server Virtual Machine (server VM) instead of the Java HotSpot Client Virtual Machine (client VM). The aim is to improve performance even if no one configures the VM to reflect the application it's running. In general, the server VM starts up more slowly than the client VM, but over time runs more quickly.
​
Note: For Java SE 6, the definition of a server-class machine is one with at least 2 CPUs and at least 2GB of physical memory.
In Java SE 6, server-class detection occurs if neither -server nor -client is specified when launching the application on an i586 or Sparc 32-bit machine running Solaris or Linux. As the following table shows, the i586 Microsoft Windows platform uses the client VM by default. The remaining platforms use only the server VM.

从Java SE 5.0开始,当应用程序启动时,启动器可以尝试检测应用程序是否在"服务器类"机器上运行,如果是,则使用Java HotSpot Server虚拟机(Server VM)而不是Java HotSpot Client虚拟机(Client VM)。其目的是提高性能,即使没有人配置VM来反映它正在运行的应用程序。通常,服务器VM的启动速度比客户机VM慢,但随着时间的推移运行速度更快。

注意:对于Java SE 6,服务器类机器的定义是至少有2个cpu和至少2GB物理内存的机器。 在Java SE 6中,如果在运行Solaris或Linux的i586或Sparc 32位机器上启动应用程序时既没有指定-server也没有指定-client,则会进行服务器类检测。如下表所示,i586 Microsoft Windows平台默认使用客户端虚拟机。其余平台仅使用服务器虚拟机。

Architecture OS Default client VM if server-class, server VM; otherwise, client VM Default serve
SPARC 32-bit Solaris X
i586 Solaris X
i586 Linux X
i586 Microsoft Windows X
SPARC 64-bit Solaris --- X
AMD64 Solaris --- X
AMD64 Linux --- X
AMD64 Microsoft Windows --- X

Legend: X = default VM --- = client VM not provided for this platform

1.5 java -cp /-classpath

这个就很好理解了,指定你的类路径,也就是你的classpath

1.6 java -X

这个参数太多了 后续会单独讲这个,而且这也是非常重要的一个参数

1.7 java -ea / -enableassertions

这个参数则是启动系统断言,可能有些刚开发的朋友没有用过断言,下面有一个简单的使用方法,但是实际很少会有使用这个的,我们都有其他判断方法

arduino 复制代码
public class AssertionExample {
    public static void main(String[] args) {
        int x = 10;
​
        assert x > 0 : "x must be greater than 0";
​
        System.out.println("Rest of the program");
    }
}

1.8 java -agentlib /-agentpath

这个参数使我们能加载其他第三方依赖库

1.9 java -javaagent

在 Java 中,-javaagent 是一种 Java 虚拟机(JVM)选项,用于指定 Java 代理(agent)库。代理库通常用于在运行时操纵字节码,实现一些增强、监控或转换的功能。

由于篇幅问题,笔者不会把每一章都写的很长,那样影响观感,有些本次介绍相对简单的,会在后面文章中详细介绍的

相关推荐
2402_8575893629 分钟前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
吾爱星辰1 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
哎呦没2 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
编程、小哥哥2 小时前
netty之Netty与SpringBoot整合
java·spring boot·spring
IT学长编程3 小时前
计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·玩具租赁系统
莹雨潇潇3 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
杨哥带你写代码3 小时前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端
郭二哈4 小时前
C++——模板进阶、继承
java·服务器·c++
A尘埃4 小时前
SpringBoot的数据访问
java·spring boot·后端
yang-23074 小时前
端口冲突的解决方案以及SpringBoot自动检测可用端口demo
java·spring boot·后端