java保证类不被回收
1.答疑(总结:只有在进程不关闭的情况下类才不会被回收)
问: 一个web应用中 初始化的时候会给一个类中的静态成员变量赋值,
然后隔一段时间会改变成员变量中的值,这样java会自动回收吗?
如果长时间不改变成员变量的值会给我回收掉吗?
如果回收的话有什么办法可以不让他回收?
答:
静态类本身不会回收,但是如果你的程序运行在容器中(比如web程序),
而容器本身会回收,这种情况相当于关闭了你的程序。
那么当然这些变量全部都没有了。
你有两个办法,一个是根据容器的约定,阻止它回收。
比如说容器规定,10分钟没有用户访问,就回收你的程序,
那么你就每几分钟自己拨测下自己,
产生一个响应,这样就不会回收了。
还有一个办法就是不断将这些变量存入数据库或者文件中,
并且在启动的时候加载,这样就避免回收造成的数据丢失。
答:可以明确告诉你只要程序不结束,类的静态成员变量是不会回收的
答:静态变量是不会回收的,除非你的应用(如果是web应用,服务关闭)退出才会回收。
答:java虚拟机标准,定义的static变量是随服务主进程一同存在的。
即服务进程在,static变量就不会被回收。。。
通俗点,用tomcat部署的服务,只要服务还在,程序里面定义的static变量就一直存在。
在你的描述中有“然后隔一段时间会改变成员变量中的值”。
对于全局静态变量,你需要在此处做好多线程同步问题。
防止数据脏读脏写。。。如果你的静态变量是集合,
请分析情况设计多线程并发问题。
如果考虑不清楚,建议使用线程安全的集合。
2.进程不关闭
APP开发
linux(总结:这里的思想是如何重启进程)
1. 需求 在实际编写应用程序的时候,可能会出现如下场景,
你正在开发阶段,但是你的上层,可能也要测试,
此时,你的程序不定时的因为某种原因会蹦掉,但其实你不关心,
因为在开发阶段,具体原因留待以后解决,
此时,一个保证你程序能自动重启的机制就需要了。
2. 正文 2.1 保证进程不退出的思路大致是这样的: (1)用 ps 查看进程 (2)在进程退出的时候,重启进程 有了思路,我们还要确认的一点是,多长时间去执行一会这个步骤。假设10s,接下来便是用crontab来每10s查看一下进程中有没有ss.out进程,如果没有,将重新启动进程。 2.2 代码 crontab的设置如下: > crontab -e 这里可能会提示没有 /var/spool/cron/crontabs 这个文件夹,我们创建即可 > mkdir -p /var/spool/cron/crontabs 在弹出的编辑器里输入如下内容 * * * * * /home/root/retain_program.sh * * * * * sleep 10; /home/root/retain_program.sh * * * * * sleep 20; /home/root/retain_program.sh * * * * * sleep 30; /home/root/retain_program.sh * * * * * sleep 40; /home/root/retain_program.sh * * * * * sleep 50; /home/root/retain_program.sh 【1】crontab设置的意思是没1分钟,执行上边代码中的内容,这个的意思就是每10s执行一次 /home/root/retain_program.sh 脚本 接下来我们编写 /home/root/retain_program.sh 脚本 #!/bin/sh cnt=`ps | grep ss.out | grep -v "grep" | wc -l` if [ $cnt -eq 0 ] then echo `date` >> /home/root/1.txt /home/root/ss.out& fi 【1】在每次检查到没有 ss.out 进程的时候,把此时的时间追加的形式写到1.txt中,并且重新启动进程ss.out 启动crontab守护进程 > crond
学习来源:
https://ask.csdn.net/questions/157613
//保证进程不关闭的方式
https://blog.csdn.net/lixuce1234/article/details/72866293
//linux中保证进程不退出
https://blog.csdn.net/qqliyunpeng/article/details/81321541
//进程原理
https://blog.csdn.net/qq_27320195/article/details/85236642