首页 > 后端开发 > 正文

Linux 下的Java进程自己关闭,怎么解

2024-03-29 16:54:45 | 我爱编程网

最近经常有小伙伴私信询问Linux 下的Java进程自己关闭,怎么解相关的问题,今天,我爱编程网小编整理了以下内容,希望可以对大家有所帮助。

本文目录一览:

Linux 下的Java进程自己关闭,怎么解

Linux 下的Java进程自己关闭,怎么解

Linux中java进程自己关闭,有2种可能:

1、是程序本身出现bug,造成java程序崩溃,进程失效;

2、是系统服务设置了自我监控的机制,java占用资源过多的话,关闭了java进程来释放占用的资源。

Linux 下的Java进程自己关闭,怎么解

linux运行java程序linux运行java

怎么在linux中运行jar包?

有以下几种方式:

1、java-jarxxxxx.jar//当前ssh窗口被锁定,可按CTRL+C打断程序运行,或直接关闭窗口,程序退出

2、java-jarxxxxx.jar//当前ssh窗口不被锁定,但是当窗口关闭时,程序中止运行。

3、nohupJava-jarxxxxxx.jar//意思是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行

4、nohupJava-jarxxxxxx.jar>aa.log//指定输出日志文件,意思是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行

Linux 下的Java进程自己关闭,怎么解

linuxC线程异常退出调查linuxc线程

Exceptioninthreadmain解决办法?

Java命令行执行的时候,会出这样的出错信息Exceptioninthreadmainjava.lang.NoclasSdeffounderror:应该这样检查你的环境和你的操作:

1、你的文件名对吗?JAVA要求你的文件和你的类名严格对应的。比如publicclassHelloword{..-那么文件名一定只能是Helloworld.java,看仔细了!

2、你的程序中有main方法马?参数什么的对吗?main方法的声明应该是这样子的:publicstaticVoidmain(Stringl们args)事实上如果你用开发工具来做的话,是不会错的。如果你用Ultraedit之类的来写程序的话,就一个字不要改的照抄吧!

3、记住,Javac后面跟的参数是文件名,但java后面跟的是类名!这是我开始学JAVA是犯的错,javaHelloworld,class,然后就报错。后来才弄明白,应该是avaHelloworld。

4、设置了classpath了吗?不仅是在安装JDK时要设置的内容,一般来说最好还要自己设置一个目录来存放自己的类文件的。比如d:NclassE目录。设置classpath=%classpath%;dclass-那么,现在将Helloworlc.class文件COPY到d:classE目录下,再javaHelloWorld应该就OK了。

5、结合第3点和第4点如果你的类是属于某一个包的,比如这样一个类sony.test.Helloworld,那么按照我在第4点中说的目录来说,就应该Helloworld,class文件存放到d:classsonytest目录下。

执行的时候应该参考第3点中说的,按类名执行:javasonytest,HelloWorld。明白了吗?一直我也想不出还会有什么理由造成这个出错信息了!如果有哪位兄弟想到了就补充一下吧!其实如果你使用了一些比较好的编程工具的话,根本就没有机会碰到这个错误的,至少我在使用了Visual/AgeforJava之后,就没有这样的事情了。好啦,不说了祝同志们好运吧!过了这第一道门,后面的就比较简单啦。

Linux多线程通信?

PIPE和FIFO用来实现进程间相互发送非常短小的、频率很高的消息;

这两种方式通常适用于两个进程间的通信。

共享内存用来实现进程间共享的、非常庞大的、读写操作频率很高的数据(配合信号量使用);

这种方式通常适用于多进程间通信。

其他考虑用socket。这里的“其他情况”,其实是今天主要会碰到的情况:

分布式开发。

在多进程、多线程、多模块所构成的今天最常见的分布式系统开发中,

socket是第一选择

。消息队列,现在建议不要使用了----因为找不到使用它们的理由。在实际中,我个人感觉,PIPE和FIFO可以偶尔使用下,共享内存都用的不多了。在效率上说,socket有包装数据和解包数据的过程,所以理论上来说socket是没有PIPE/FIFO快,不过现在计算机上真心不计较这么一点点速度损失的。你费劲纠结半天,不如我把socket设计好了,多插一块CPU来得更划算。另外,进程间通信的数据一般来说我们都会存入数据库的,这样万一某个进程突然死掉或者整个服务器死了,也不至于丢失重要数据、便于回滚到之前的状态。从这个角度考虑,适用共享内存的情况也更少了,所以socket使用得更多。再多说一点关于共享内存的:共享内存的效率确实高,但它的重点在“共享”二字上。如果的确有好些进程共享一大块数据(如果把每个进程都看做是类的对象的话,那么共享数据就是这个类的static数据成员),那么共享内存就是一个不二的选择了。但是在面向对象的今天,我们更多的时候是多线程+锁+线程间共享数据。因此共享进程在今天使用的也越来越少了。不过,在面对一些极度追求效率的需求时,共享内存就会成为唯一的选择,比如高频交易系统。除此以外,一般是不需要特意使用共享内存的。另外,

PIPE和共享内存是不能跨LAN的

(FIFO可以但FIFO只能用于两个进程通信)

如果你的分布式系统随着需求的增加而越来越大所以你想把不同的模块放在不同机器上而你之前开发的时候用了PIPE或者共享内存,那么你将不得不对代码进行大幅修改......同时,即使FIFO可以跨越LAN,其代码的可读性、易操作性和可移植性、适应性也远没有socket大。这也就是为什么一开始说socket是第一选择的原因。最后还有个信号简单说一下。

请注意,是信号,不是信号量。

信号量是用于同步线程间的对象的使用的(建议题主看我的答案,自认为比较通俗易懂:

semaphore和mutex的区别?-Linux-知乎

)。信号也是进程间通信的一种方式。比如在Linux系统下,一个进程正在执行时,你用键盘按Ctrl+c,就是给这个进程发送了一个信号。进程在捕捉到这个信号后会做相应的动作。虽然信号是可以自定义的,但这并不能改变信号的局限性:

不能跨LAN、信息量极其有限

。在现代的分布式系统中,通常都是

消息驱动:

即进程受到某个消息后,通过对消息的内容的分析然后做相应的动作。如果你把你的分布式系统设置成信号驱动的,这就表示你收到一个信号就要做一个动作而一个信号的本质其实就是一个数字而已。这样系统稍微大一点的话,系统将变得异常难以维护;甚至在很多时候,信号驱动是无法满足我们的需求的。因此现在我们一般也不用信号了。因此,请记住:

除非你有非常有说服力的理由,否则请用socket。

顺便给你推荐个基于socket的轻量级的消息库:ZeroMQ。

linux怎么指定线程库?我爱编程网

大概的介绍一下Linux的指定CPU运行,包括进程和线程。linux下的top命令是可以查看当前的cpu的运行状态,按1可以查看系统有多少个CPU,以及每个CPU的运行状态。可是如何查看线程的CPU呢?

top-Hppid,pid就是你当前程序的进程号,如果是多线程的话,是可以查看进程内所有线程的CPU和内存使用情况。

pstree可以查看主次线程,同样的pstree-ppid。可以查看进程的线程情况。

taskset这个其实才是重点,可以查看以及设置当前进程或线程运行的CPU(设置亲和力)。

taskset-pcpid,查看当前进程的cpu,当然有的时候不只是一个,taskset-pccpu_numpid,cpu_num就是设置的cpu。这样的话基本的命令和操作其实大家都知道了,接下来就是在代码中完成这些操作,并通过命令去验证代码的成功率。进程制定CPU运行:

viewplaincopy#include#include#include#include#include#define__USE_GNU#include#include#includeintmain(intargc,char*argv){//sysconf获取有几个CPUintnum=sysconf(_SC_NPROCESSORS_CONF);intcreated_thread=0;intmyid;inti;intj=0;//原理其实很简单,就是通过cpu_set_t进行位与操作cpu_set_tmask;cpu_set_tget;if(argc!=2){printf(usage:./cpunumn);exit(1);}myid=atoi(argv)

;printf(systemhas%iprocessor(s).n,num)

;//先进行清空,然后设置掩码CPU_ZERO(mask);CPU_SET(myid,mask)

;//设置进程的亲和力if(sched_setaffinity(0,sizeof(mask),mask)==-1){printf(warning:couldnotsetCPUaffinity,continuing...n);}while(1){CPU_ZERO(get);//获取当前进程的亲和力if(sched_getaffinity(0,sizeof(get),get)==-1){printf(warning:coundnotgetcpuaffinity,continuing...n);}for(i=0;inum;i++){if(CPU_ISSET(i,get)){printf(thisprocess%disrunningprocessor:%dn,getpid(),i);}}}return0;}进程设置CPU运行,其实只能是单线程。多线程设定CPU如下:

viewplaincopy#define_GNU_SOURCE#include#include#include#include#include#includevoid*myfun(void*arg){cpu_set_tmask;cpu_set_tget;charbuf;inti;intj;//同样的先去获取CPU的个数intnum=sysconf(_SC_NPROCESSORS_CONF);printf(systemhas%dprocessor(s)n,num);for(i=0;inum;i++){CPU_ZERO(mask);CPU_SET(i,mask);//这个其实和设置进程的亲和力基本是一样的if(pthread_setaffinity_np(pthread_self(),sizeof(mask),mask)0){fprintf(stderr,setthreadaffinityfailedn);}CPU_ZERO(get);if(pthread_getaffinity_np(pthread_self(),sizeof(get),get)0){fprintf(stderr,getthreadaffinityfailedn);}for(j=0;jnum;j++){if(CPU_ISSET(j,get)){printf(thread%disrunninginprocessor%dn,(int)pthread_self(),j);}}j=0;while(j++100000000){memset(buf,0,sizeof(buf));}}pthread_exit(NULL);}intmain(intargc,char*argv){pthread_ttid;if(pthread_create(tid,NULL,(void*)myfun,NULL)!=0){fprintf(stderr,threadcreatefailedn);return-1;}pthread_join(tid,NULL);return0;}

linux有没有线程id确认函数?

linuxC中,获取当前进程id函数为getpid();头文件:#include?函数原型:pid_t?getpid(void);函数说明:getpid?()用来取得目前进程的进程id,许多程序利用取到的此值来建立临时文件,?以避免临时文件相同带来的问题。返回值:目前进程的进程id范例#include?#include?main(){????printf(pid=%dn,?getpid());}执行:pid=1494?/*每次执行结果都不一定相同?*/

以上就是我爱编程网小编整理的内容,想要了解更多相关资讯内容敬请关注我爱编程网。
与“Linux 下的Java进程自己关闭,怎么解”相关推荐