java进程之间以及跟JVM是什么关系

1、命令启动了两个java程序,它们之间是什么关系;

2、java程序又和JVM之间是什么关系,它们是公用一个JVM,还是每个java程序,都有一个JVM。
图片说明

图片说明

9个回答

一个java程序对应一个进程,一个jvm实例,进程之间互不干涉,jvm实例之间也互不影响,你干掉其中一个程序并不影响另外一个的正常运行

java_System_in
Mr_Wuxl 我觉得应该是这样,不知道大家怎么看
接近 2 年之前 回复

1.程序的运行是以进程在内存中的运行形式体现的。当你启动一个程序时,系统会调用其对应进程进入内存运行,图中进程的pid即为进程的唯一标识符。然后进程之间是并发执行的。准确的说,你启动的是java程序,但系统运行的是进程,因为程序是静态的,进程才是动态的,也就是程序并不会进入内存运行,而是其对应进程进入内存运行。
2.是公用一个JVM的,这个就类似你电脑自己的操作系统,打开两个程序肯定是在同一个系统内存中运行的,原因就是我问题一中说的进程是并发执行的。
望采纳,谢谢。

datadev_sh
datadev_sh 回复alittlebirdsd: 难道有JVM和JVM实例的分别?为什么也有人认为是只有一个JVM。
2 年多之前 回复
alittlebirdsd
alittlebirdsd 题主的意思是问JVM对象吧,每个Java程序进程都有一个JVM实例吧。
2 年多之前 回复

命令行启动的java程序是共用一个jvm的,启动一个程序就是在jvm中开启一个进程,每个进程至少有一个线程,当然可以有多个线程,
线程之间通信比较简单,就像java书上讲的一样,但进程间的通信复杂点,如管道、内存映射、内存共享、消息队列、socket等,你可以简单理解为两个进程间没关系

进程与进程之间是互不干扰的,可以并行的,一个程序(不管是什么程序)占用一个进程,但可以占用多个线程,jvm是用来将.class文件解释成二进制并让计算机能够识别的,要说联系的话,就是jvm运行解释.class文件之后会形成进程

只有一个jvm,jvm就是虚拟机,用来运行编译程序的

datadev_sh
datadev_sh 那么当没有java存续运行的时候,JVM是个什么样的存在或者说不存在?然后起了一个java程序,有了一个活的JVM,然后别的java程序加入这个JVM?
2 年多之前 回复

一个java程序对应一个进程,进程和jvm实例之间互不影响

2个进程肯定是2个jvm实例,我们jps调优的时间jps的pid对应的是一个实例的id,并且我们后面分析jvm都是在某一个pid下进行分析这个虚拟机实例。
2个pid肯定对应的两个jvm,要不我们平时监控一个pid如何能分析出来是程序的哪块出问题呢(能找到问题,jvm的信息都是在这个pid下的情况),连个
进程要是在一个jvm下,岂不是很乱看不出问题么、

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Python+OpenCV计算机视觉

Python+OpenCV计算机视觉

JVM每个进程都有吗???

Java中每个进程都有一个JVM吗,就相当于lunux中每个进程都有独立的内存空间吗,哪位大神能帮忙详细解释一下

Java中如何做跨进程的同步?

两个进程A和B,运行在不同的JVM上。现在我需要的是A先在某个事件上阻塞,直到B发一个消息,A才可以继续。 PS: 1.项目运行在windows平台上,不用考虑跨平台的问题。 2.能够用同步的方式,不要轮寻最好。 如果是C/C++,可以用Win32的系统对象; 如果是.Net也有封装好的对象可以做到。 我对java的类库不是很熟悉。java里有现成的类可以支持进程间的同步吗?或者,如果有开源的项目可以做到也可以。 我能想到的一个方法是写JNI去调Win32的API。不知有没有更好的办法。 多谢

java 调用C语言,然后在 c中创建jvm(想在C中再调用Java)返回-1!

,请教一个问题: 现在Java 调C 代码( C作为 .so 文件), 和C(C作为可执行程序)调用Java 代码都没问题。 但是我现在测试 Java 调用C代码时,在C中同时也 调用Java 代码出现了问题(创建JVM时 失败。 在一些场景下 需要C 主动调用Java),大家之前遇到过这类场景么? 怎么解决,

tomcat 启动的java.exe进程为什么在任务管理器中看不见对应的PID

在服务器上部署了 3个项目,用了三个tomcat,其中两个都能正常使用:端口分别是80 和 8888两个端口都找到了对应的进程 PID和端口号能对应上。 但另一tomcat个Connector的端口8887 为什么会被占用了? 在dos netstat-b命令下找到了 占用8887端口的 进程PID是6228 但在任务管理器中就是没有找到PID为6228的进程。 java.exe 是启动jvm的,而tomcat是怎样做到直接启动startup.bat就能启动java.exe来让jvm运行应用程序的了? 还望高手细细赐教。 感激不尽。

查看java进程加载了哪些jar包。

各位大神帮帮忙。如何查看一个java进程加载了哪些jarbao包?有没有比较好的工具。

请问用jmap -heap查到的大小与top查java进程占用的res内存为什么不相同?

同样的一个java进程,用top查询: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 5466 root 15 0 2369m 106m 10m S 0.0 1.3 0:08.02 java 占用的内存RES是106m, 而用jmap -heap查到是这样: Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 2074083328 (1978.0MB) NewSize = 1310720 (1.25MB) MaxNewSize = 17592186044415 MB OldSize = 5439488 (5.1875MB) NewRatio = 2 SurvivorRatio = 8 PermSize = 21757952 (20.75MB) MaxPermSize = 85983232 (82.0MB) Heap Usage: PS Young Generation Eden Space: capacity = 17760256 (16.9375MB) used = 9450928 (9.013107299804688MB) free = 8309328 (7.9243927001953125MB) 53.21391763722325% used From Space: capacity = 5046272 (4.8125MB) used = 131072 (0.125MB) free = 4915200 (4.6875MB) 2.5974025974025974% used To Space: capacity = 5373952 (5.125MB) used = 0 (0.0MB) free = 5373952 (5.125MB) 0.0% used PS Old Generation capacity = 86441984 (82.4375MB) used = 34584152 (32.982017517089844MB) free = 51857832 (49.455482482910156MB) 40.00851253020755% used PS Perm Generation capacity = 21757952 (20.75MB) used = 9505648 (9.065292358398438MB) free = 12252304 (11.684707641601562MB) 43.688155944088855% used 使用的加起来51m左右 请问应该怎样查一个java进程所占用的内存? 看了一些国外的文章,说java heap查的只有堆内存和 Perm 内存的大小,JVM 中还有栈内存,JNI等,每个线程还得占据一定的内存,有没有什么命令可以查询这些内存呢?

多个程序使用同一个jdk时,jvm内存怎么分配

当有多个程序同时运行,并且指定的时同一个jdk时,这个时候jvm是如何分配内存的? 假如 配置了jvm的内存为 2G,现在同时运行3个程序,这时是不是每个程序都有一个独立的jvm,并且每个jvm的内存都是2G呢?

在Go中启动Java进程

<div class="post-text" itemprop="text"> <p>I am trying to start a Java-process using Go but am unable to get Java to recognise the classpath. The code looks somewhat like:</p> <pre><code>args := []string{ "-Xmx64m", "-Dmy.property=value, "-cp", "lib/jar1.jar:lib/jar2.jar", "com.things.MyClass", } c := exec.Command(javaBinary, args...) </code></pre> <p>Unfortunately when executing this I get the dreaded <code>Error: Could not find or load main class</code> from the JVM. However if I take the output from <code>c.Args</code> and run it directly in a terminal it seems to work just fine, which to me indicates that I am somehow launching the process incorrectly.</p> <p>Is there a better way of doing this?</p> </div>

关于Java中进程中的优先级的一点疑问

<div class="iteye-blog-content-contain" style="font-size: 14px;"> <pre name="code" class="java">public class BasicThreadTest extends Thread{ private String _name; public BasicThreadTest(String name){ _name = name; } public void run(){ try{ for(int i = 0; i &lt; 30; i++){ System.out.println("run ... " + _name + " ... " + i); } }catch(Exception e){ e.printStackTrace(); } } public static void main(String[] args){ BasicThreadTest th1 = new BasicThreadTest("A"); th1.setPriority(7); th1.start(); BasicThreadTest th2 = new BasicThreadTest("B"); System.out.println(th2.getPriority()); th2.start(); } }</pre> <p> </p> <p>在上述代码中,为线程A设置优先级为7,而线程B优先级默认为5。线程A的优先级高于线程B,理论上讲,应该改是A全部执行完成之后,才能执行B。但是实际运行结果为什么是这样的呢?</p> <pre name="code" class="java">5 run ... A ... 0 run ... A ... 1 run ... A ... 2 run ... A ... 3 run ... A ... 4 run ... A ... 5 run ... A ... 6 run ... A ... 7 run ... A ... 8 run ... B ... 0 run ... A ... 9 run ... B ... 1 run ... A ... 10 run ... A ... 11 run ... A ... 12 run ... A ... 13 run ... A ... 14 run ... B ... 2 run ... A ... 15 run ... A ... 16 run ... B ... 3 run ... B ... 4 run ... B ... 5 run ... B ... 6 run ... A ... 17 run ... B ... 7 run ... A ... 18 run ... B ... 8 run ... A ... 19 run ... B ... 9 run ... A ... 20 run ... B ... 10 run ... A ... 21 run ... B ... 11 run ... A ... 22 run ... B ... 12 run ... A ... 23 run ... B ... 13 run ... A ... 24 run ... B ... 14 run ... A ... 25 run ... B ... 15 run ... A ... 26 run ... B ... 16 run ... A ... 27 run ... B ... 17 run ... A ... 28 run ... B ... 18 run ... A ... 29 run ... B ... 19 run ... B ... 20 run ... B ... 21 run ... B ... 22 run ... B ... 23 run ... B ... 24 run ... B ... 25 run ... B ... 26 run ... B ... 27 run ... B ... 28 run ... B ... 29 </pre> <p> </p> <p>多运行几次的结果有时会在线程A全部执行之后,线程B再执行;有时会出现交错的情况。</p> <p> </p> <p>不是很理解优先级在这里好像没体现出作用,为什么呢?</p> </div>

JVM 主线程退出,程序退出

关于JVM退出的问题,找到的资料都是 正常情况下当所有的non-deamon线程都结束时,JVM退出 但自己测试了一下,发现方法 startTest尽管创建了10个线程,但要是我取消了end.await,主线程结束,JVM就退出了,创建的线程也不会执行。 问题在于,通过日志可以了解,其实创建的子线程也是Non-daemon线程,那为什么JVM在还有Non-daemon线程时,也会推出呢? 代码如下,可以通过是否注释end.await调试 ``` package com.unionpay.content.cache; import java.util.concurrent.CountDownLatch; import org.junit.Test; import net.sf.ehcache.Element; public class EhcacheTest { CountDownLatch start; CountDownLatch end; int threadsNum=10; int startThead=3; @Test public void startTest() throws ClassNotFoundException, InterruptedException { start=new CountDownLatch(startThead); end=new CountDownLatch(threadsNum); for (int i = 0; i < threadsNum; i++) { Thread thread=new Thread(new Runnable() { public void run() { try { ehcacheTest(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println(Thread.currentThread().getName()+" exist error "); } } },"thread"+i); thread.start(); start.countDown(); } end.await(); System.out.println("this is end"); } public void ehcacheTest() throws InterruptedException { System.out.println("Deamon thread"+Thread.currentThread().isDaemon()); System.out.println(Thread.currentThread().getName()+" is already"); start.await(); String key="a"; Element element=EhcacheUtil.get(key); if (element == null) { System.out.println(Thread.currentThread().getName()+" get element is null"); String result=serviceTest(key); EhcacheUtil.put(key, result, 5); }else{ System.out.println(Thread.currentThread().getName()+" get element has something"); String aString=(String) EhcacheUtil.get(key).getObjectValue(); System.out.println("aString is:"+aString); } end.countDown(); } public String serviceTest(String key) { int count=1; count++; System.out.println(Thread.currentThread().getName()+"get into serviceTest "+count+" times"); return ""+count; } } ```

服务器大内存jvm配置.。。

公司现在要上线java项目,提供了32G的内存机器,8核,我要怎么设置jvm的大小, 如果设置的太大会不会gc回收的时间过长造成系统卡顿或者内存泄露,怎么在内存 利用和性能调优中权衡呢,就大神解答

一个程序是否对应一个jvm实例?

在android中,一个应用程序会对应一个dvm实例。那在pc端,JVM是否也是这样?

java初始化堆内存为8g,操作系统真的会立即分配8g的内存吗

最近看了一个问题,说是 java在创建子进程的时候,由于会申请和父进程相似大小的 内存空间,导致内存使用量翻倍,所以想验证一下. 代码如下所示 ```java public class ProcessDemo { public static void main(String[] args) throws Exception{ Thread.sleep(20000); ProcessBuilder pb = new ProcessBuilder("/bin/sh", "-c","ifconfig"); Process process = pb.start(); Scanner scanner = new Scanner(process.getInputStream()); while (scanner.hasNextLine()) { System.out.println(scanner.nextLine()); } Thread.sleep(20000); scanner.close(); } } ``` 第一个sleep20秒 是为了使用ps -ef | grep ProcessDemo 查看进程号 然后使用top -p pid 来观察内存使用情况 如下所示 我设置初始化堆内存为8g,但是这个java进程并没有占用8g的内存空间 ![图片说明](https://img-ask.csdn.net/upload/201909/27/1569551954_815263.png)

如何用java执行shell脚本先kill掉进程然后再重新执行noup java -jar xxx.jar &的命令,我使用java执行shell脚本能kill 掉进程,但是后面重启命令没生效,shell脚本单独运行又是能正常kill掉然后重启的

相关脚本在下方 #!/bin/bash #jar包文件路径及名称(目录按照各自配置) APP_NAME=/home/alitest20200514.jar #日志文件路径及名称(目录按照各自配置) LOG_FILE=/home/monifashe.log #查询进程,并杀掉当前jar/java程序 pid=`ps -ef|grep $APP_NAME | grep -v grep | awk '{print $2}'` kill -9 $pid echo "$pid进程终止成功" sleep 2 #判断jar包文件是否存在,如果存在启动jar包,并时时查看启动日志 if test -e $APP_NAME then echo '文件存在,开始启动此程序...' # 启动jar包,指向日志文件,2>&1 & 表示打开或指向同一个日志文件 nohup java -jar $APP_NAME > $LOG_FILE 2>&1 & #实时查看启动日志(此处正在想办法启动成功后退出) tail -f $LOG_FILE #输出启动成功(上面的查看日志没有退出,所以执行不了,可以去掉) #echo '$APP_NAME 启动成功...' else echo '$APP_NAME 文件不存在,请检查。' fi 下方是java调用代码 /** * 带返回结果的命令执行 * @return */ public static void execCmdWithResult() { try { String cmd = "java_start.sh"; // String command = cmd; // //接收正常结果流 // ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); // //接收异常结果流 // ByteArrayOutputStream errorStream = new ByteArrayOutputStream(); // CommandLine commandline = CommandLine.parse(command); // DefaultExecutor exec = new DefaultExecutor(); // exec.setExitValues(null); // //设置一分钟超时 // ExecuteWatchdog watchdog = new ExecuteWatchdog(60*1000); // exec.setWatchdog(watchdog); // PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream,errorStream); // exec.setStreamHandler(streamHandler); // exec.execute(commandline); // //不同操作系统注意编码,否则结果乱码 // String out = outputStream.toString("utf-8"); // String error = errorStream.toString("utf-8"); ProcessBuilder pb = new ProcessBuilder("./"+cmd); pb.directory(new File("/home/")); int runningStatus = 0; String s = null; Process p = pb.start(); BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); while ((s = stdInput.readLine()) != null) { System.out.println("正常:" + s); } while ((s = stdError.readLine()) != null) { System.out.println("不正常:" + s); } runningStatus = p.waitFor(); System.out.println("runningStatus:" + runningStatus); } catch (Exception e) { e.printStackTrace(); } }

请教个问题:java进程显示占用了1.4G内存,但在jconsole里怎么才是100M左右?

我用如下代码做一个简单的实验,发现java进程显示占用了1.4G内存,但在jconsole里怎么才是100M左右。 public static void main(String[] args) throws IOException { for (int i = 0; i < 100; i++) { test1(); } System.gc(); Runtime run=Runtime.getRuntime(); //取得当前jvm的运行时实例 run.gc(); //运行Runtime的垃圾回收方法 System.in.read(); } /** * 循环到调用该方法1000次,内存涨到1.4G后不再增长,始终维持这个内存,怎么GC也不降低。 */ private static void test1() { for (int i = 0; i < 1000; i++) { byte[] so = new byte[1000000]; so = null; } } ![图片说明](https://img-ask.csdn.net/upload/201711/17/1510887621_909596.png) 点击jconsole的GC按钮,jconsole里占用内存下降了,但是java进程还是1.4G。 ![图片说明](https://img-ask.csdn.net/upload/201711/17/1510887652_162531.png)

JAVA的多个线程可以同时在CPU的多个核心上运行么?

现在的电脑cpu 都是多核,CPU对于各个线程的调度是随机的(分时调度),如果程序中 开启了多个线程,那么这几个线程是分别同时运行在不同的核心上呢,还是由于 JVM对线程的调度,使得 这几个线程 分时 跑在一个核心上呢? (另外,在一个核心上 是否 能有两个 线程 同时运行呢?(不采用分时调度)) 搜了半天 但是都是有些模棱两可 ,只好特来请教,谢谢!

在docker里运行的java程序如何避免内存超过容器限制导致的os kill?

条件 1. docker里运行java程序,docker容器限制了内存 1. jvm的heap内存必须常驻物理内存,不能被置换 1. jvm的native、direct内存不可控,也没办法限制上限 目标:如何保证运行java程序的docker容器不会因为内存超过限制而被os kill 我的想法: 1. jvm是否有参数可以让native、direct内存通过文件映射分配,通过映射文件去和容器剩余物理内存进行置换 2. docker容器打开swap开关,但如何保证jvm的heap常驻物理内存 跪求大佬带一把,感激不尽

Java系统中GC频繁启动是什么原因?

我这两天在面试一个工作,他们好像遇到问题,可能现在的系统代码质量不高,GC每3 秒钟启动一次,他问我是不是修改JVM的参数可以解决,调正GC的young、old、 permanent的大小?我过两天要去面试,想准备一下,有人知道这是为什么吗?有什么 解决的途径?

java同台计算机两程序交互

<p>有两个程序,都为java程序,在同一台机器上运行,在运行时两程序要进行交互,我不知道他们怎样进行通信,希望指点一下,给个思路!(这两个程序的位置是不确定的)</p><br /><strong>问题补充:</strong><br />如果用SOCKET的话,不是就要用服务器嘛? <br />我不想使用服务器,有没有别的方法,比如说,进程是否可以共享?

2019 Python开发者日-培训

2019 Python开发者日-培训

150讲轻松搞定Python网络爬虫

150讲轻松搞定Python网络爬虫

设计模式(JAVA语言实现)--20种设计模式附带源码

设计模式(JAVA语言实现)--20种设计模式附带源码

YOLOv3目标检测实战:训练自己的数据集

YOLOv3目标检测实战:训练自己的数据集

java后台+微信小程序 实现完整的点餐系统

java后台+微信小程序 实现完整的点餐系统

三个项目玩转深度学习(附1G源码)

三个项目玩转深度学习(附1G源码)

初级玩转Linux+Ubuntu(嵌入式开发基础课程)

初级玩转Linux+Ubuntu(嵌入式开发基础课程)

2019 AI开发者大会

2019 AI开发者大会

玩转Linux:常用命令实例指南

玩转Linux:常用命令实例指南

一学即懂的计算机视觉(第一季)

一学即懂的计算机视觉(第一季)

4小时玩转微信小程序——基础入门与微信支付实战

4小时玩转微信小程序——基础入门与微信支付实战

Git 实用技巧

Git 实用技巧

Python数据清洗实战入门

Python数据清洗实战入门

使用TensorFlow+keras快速构建图像分类模型

使用TensorFlow+keras快速构建图像分类模型

实用主义学Python(小白也容易上手的Python实用案例)

实用主义学Python(小白也容易上手的Python实用案例)

程序员的算法通关课:知己知彼(第一季)

程序员的算法通关课:知己知彼(第一季)

MySQL数据库从入门到实战应用

MySQL数据库从入门到实战应用

机器学习初学者必会的案例精讲

机器学习初学者必会的案例精讲

手把手实现Java图书管理系统(附源码)

手把手实现Java图书管理系统(附源码)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

.net core快速开发框架

.net core快速开发框架

玩转Python-Python3基础入门

玩转Python-Python3基础入门

Python数据挖掘简易入门

Python数据挖掘简易入门

微信公众平台开发入门

微信公众平台开发入门

程序员的兼职技能课

程序员的兼职技能课

Windows版YOLOv4目标检测实战:训练自己的数据集

Windows版YOLOv4目标检测实战:训练自己的数据集

HoloLens2开发入门教程

HoloLens2开发入门教程

微信小程序开发实战

微信小程序开发实战

Java8零基础入门视频教程

Java8零基础入门视频教程

相关热词 c# 按行txt c#怎么扫条形码 c#打包html c# 实现刷新数据 c# 两个自定义控件重叠 c#浮点类型计算 c#.net 中文乱码 c# 时间排序 c# 必备书籍 c#异步网络通信
立即提问