每次我们用Java命令运行我们的Java程序,都会在JVM中开启一个进程,对于每一个进程,都会有一个相对应的工作目录,这个工作目录在虚拟机初始化的时候就已经设置好了,默认的情况下,工作目录是我们工程的根目录,比如:
/home/test/Project-
--bin
--divinemind.onlyfun.test.helloworld.java
--src
假如我们在用下面的命令启动helloworld,那么这个进程的根目录就是/home/test/Project/bin,helloworld里进行操作需要的资源,比如文件什么的,都会在这个目录进行查找。
在Windows下,情况也是相同的。我们可以通过System.getProperty(“user.dir”);取得当前进程的工作目录,而且当我们想改变这个工作目录的时候,也可以通过System.setProperty(“user.dir”,”/home/test/xxxxxxx”);设置当前进程的工作目录,但是,事实上,user.dir这个系统环境是不可以重新设置的,问题很多,最常见的问题,当前进程下的所有线程都在使用这个环境变量,如果修改的话,危险可想而知,Sun的JDK这样做估计是一个小BUG.所以,System.setProperty这个方法只是让我们看看,实际上没有作用。在Sun的JDK1.4中,当前进程的工作目录是没有办法修改的,在JDK1.5中,ProcessBuilder在这方面有所改进。
当我们没有选择需要使用非工作目录下的资源的时候,比如:Java调用A, A使用B,B和A在同一个目录下,A和B不在当前进程的工作目录下,这样的话,程序肯定运行会有问题,这个时候有两个办法可以解决
1. 所有的路径都写绝对路径
所有的路径写绝对路径可以实现,但是程序在部署的时候麻烦非常多,维护也困难,但是方法简单,直观。
2. 在当前进程中新开一个子进程,修改子进程的工作目录
在Java中新开一个子进程的方法跟JDK版本有关:
A.JDK1.4中:
Process process = System.getRuntime.exec(arg1,arg2,arg3);
arg1:系统命令
arg2:命令运行的环境变量
arg3:子进程的工作目录,在这个地方就可以设置我们自己想要的工作目录,达到使用非父进程工作目下资源的方法。
B.JDK1.5中:
在这个版本中,我们可以使用ProcessBuilder来新开一个JVM进程。
下面的代码可以实现这里我们的功能:
ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
// myDir就是当前进程的工作目录,如果不设置,那就是默认为父进程的工作//目录
pb.directory("myDir");
Process p = pb.start();
Java在平时跟操作系统的关系确实很少,我们都很少碰到问题,但是如果我们调用操作系统命令什么的时候,麻烦就多起来了,不过如果我们更多地了解JVM,问题就是比较容易解决了。
分享到:
相关推荐
Java虚拟机(JVM,Java Virtual Machine)是Java语言的核心组成部分,它负责解析并执行Java程序。在深入了解JVM之前,我们需要理解其基本结构和工作原理。以下是对JVM的详细解析: 1. **JVM启动与进程生命周期** ...
**深入理解JAVA虚拟机实用技巧案例讲解** Java虚拟机(JVM)是Java程序的核心运行环境,它负责解析字节码并执行Java程序。在实际开发中,了解JVM的工作原理和优化技巧对于提高程序性能至关重要。以下是一些关键知识...
在Java编程环境中,了解JVM(Java虚拟机)中所有线程的活动状态对于调试多线程程序至关重要。本文将详细讲解如何查看JVM中的线程活动情况,并提供相关示例代码。 首先,Java提供了`java.lang.management....
- 《深入理解Java虚拟机》:本书详细讲解了JVM的内部工作原理,适合有一定Java基础的开发人员。 - Oracle官方文档:提供最权威的JVM规范和技术文档,适合专业开发者和技术研究人员。 - Java社区和论坛:如Stack ...
除了上述提到的基础知识点外,《深入理解Java虚拟机——JVM高级特性与最佳实践(第2版)》这本书籍还深入探讨了JVM的性能调优、并发编程、以及各种高级特性的具体应用。比如,对于性能调优,书中讲解了如何根据不同的...
Java虚拟机(JVM)是Java平台的核心组成部分,它负责执行字节码,为Java程序提供跨平台的运行环境。在深入理解JVM内核的运行机制时,我们需要关注以下几个关键点: 1. **类加载机制**:JVM通过类加载器将类文件加载...
这本书的内容是帮你全面了解java虚拟机,本书第1版两年内印刷近10次,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体版在台湾也十分受欢迎。第2版在第1版的基础上做了很大的...
- `-F`:当虚拟机进程对`-dump`选项没有任何响应时,强制执行生成dump文件。 #### 五、总结 以上介绍的工具是JVM调优过程中非常重要的组成部分,通过对这些工具的理解和使用,可以有效地监测和调整JVM的状态,...
本课程的PPT旨在深入讲解JVM的工作原理、内存管理、性能优化等相关知识,帮助学员提升对JVM的理解并能应用于实际开发中。 一、JVM概述 Java虚拟机作为一个抽象的计算机,它负责解析字节码并执行Java程序。JVM的主要...
这份"JAVA架构师知识整理.zip"压缩包包含了由by2kc编纂的资料,主要涵盖了JVM(Java虚拟机)、微服务、架构设计等多个关键知识点。 首先,JVM是Java语言的核心组成部分,它负责解释和执行Java代码。理解JVM的工作...
在Java开发过程中,对JVM(Java虚拟机)的监控是至关重要的,它能帮助我们了解应用程序的运行状态,优化性能,以及及时发现并解决内存泄漏等问题。`vmmap`工具是Mac OS X系统中一个强大的内存分析工具,它可以用来...
本课程通过PPT形式的学习教案,讲解了虚拟机和解释器在软件设计中的重要角色,尤其是Java虚拟机(JVM)及其对平台独立性的支持。 虚拟机(Virtual Machine)是一种软件技术,它创建了一个抽象的计算环境,使得用户...
本课件主要讲解了虚拟机(Virtual Machine)和解释器风格,尤其是它们在计算机科学中的应用,特别是Java虚拟机(JVM)在实现平台独立性方面的关键作用。 虚拟机是一种软件技术,它为用户提供了一个抽象的计算环境,...
它的设计目标是实现“一次编写,到处运行”,这意味着编写的JAVA代码可以在任何支持JAVA虚拟机(JVM)的平台上运行,这大大增强了代码的可移植性。 JAVA文献通常包括以下几个关键知识点: 1. **JAVA语法**:JAVA的...
在实时Java平台中,JVM(Java虚拟机)被特别设计以满足确定性和低延迟的要求。这通常涉及到对JVM进行优化,使其能在预定义的时间内完成特定的任务,而不会因为垃圾回收或其他后台进程而引入不可预测的延迟。 实时...
Java虚拟机(JVM)是Java程序运行的基础,它负责解释和执行字节码,使得Java具有跨平台的特性。本篇文章将详细讲解JVM的一些常用指令,帮助开发者更好地理解和优化Java应用程序的运行。 首先,我们需要了解JVM的...
【Java虚拟机(JVM)详解】 在Java编程中,JVM(Java Virtual Machine)扮演着至关重要的角色,它是Java程序运行的平台。本课程主要围绕JVM的内存区域、垃圾收集机制以及性能监控工具进行深入讲解。 1. **年轻代...