java 缓存清理echo_“kill -9”一时爽,秋后算账泪两行

4067054c16e17bbf58e7fe2608e6b4b7.png

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。任何不保留此声明的转载都是抄袭。

kill是杀死的意思,带有主动的意味。鉴于master、slave这样的名词,需要在计算机软件中进行整改,kill这样明显带有负面信息的单词,按理说也需要被干掉。

不过,如果把命令名字改了,效果也许会更好。因为在Linux上,kill根本就不是杀死的意思。

它只是想要给进程发送一个信号而已。使用kill -l可以看到长长的信号列表。

5db6d1c32106e4dd272c1e25b473408f.png

对Java程序员来说,用的最多的就是kill -9,我也不知道从哪里来的传承,码农们都喜欢这种暴力性的命令--喜欢用锋利的匕首一击致命。

但是这种玩法又危险的多,不给进程说话的机会。

大家都知道电视剧里,重要人物临死的时候,会啰啰嗦嗦说很多话,话说不完是不会死的。无论是武林高手,还是达官贵人,都得交代一些能让故事情节继续发展下去的废话。

《水浒传》里的“英雄们”,来的就相对直接一些。看的不爽,直接单刀直入切中要害,不允许他人有一丁点的废话,通常情况下直接嗝屁。

各位使用kill -9的兄弟们,个个都像黑黑的李逵,单纯、暴力、不讲人情。

SIGKILL

9

Kill signal

结束信号

中国的中庸太极之道,在此荡然无存。kill -9直接使得优雅关闭这个名词成了废物。

何为优雅关闭?其实就像是人的“遗言”,要在死之前,交代一些身后事。

我就常常在想,在我死之前,要把所有的钱花的一分不剩。既不留给后代,也不让它烂在银行里。这就需要做很多事。

计算机软件中,在死之前,要处理的事情也还不少。比如,需要把缓冲区的内容处理完毕,发送出去;微服务节点需要先把自己从注册中心摘除,才能放心的go die。

大体来说,有下面几个影响:

请求丢失:内存队列中等待执行请求丢失

数据丢失:处于内存缓存中数据未持久化到磁盘

文件损坏:正在写的文件没有没有更新完成,导致文件损坏

业务中断:处理一半的业务被强行中断,如支付成功了,却没有更新到数据库中

服务未下线:上游服务依然往停止节点发送请求

这些情况下,如果把服务玩坏了,正好被领导撞上,被开是分分钟的事。

Java应用中处处充斥着这种优雅,靠的是shutdownhook钩子。就是下面这行代码:

Runtime

.getRuntime()

.addShutdownHook(

new Thread(() -> System.out.println("Do something in Shutdown Hook")));

有没有好的办法?有,用kill -15发送SIGTERM信号即可。

但有时候kill -15并不能杀死进程,这个时候,才是kill -9需要出场的时候。

听够了15临死前说的一些废话,使用9要它的命。

一般的,需要使用kill -15去尝试杀死进程。如果过一段时间(比如10秒),进程还没有停止,kill -9才会出场。

kill的默认信号值,就是15,可以说是很贴心了。但还是有很多人使用9。

我想了半天原因,就是一个字:懒。

kill -15需要多次确认,而kill -9一次完事,多数情况下不会出事。有这提高工作效率的事,何乐而不为呢?

常用的信号,还有SIGQUIT,也就是kill -3。

在Java程序下,kill -3的输出特别有意思,它直接在stdout上输出了jstack命令所产生的内容。如果是tomcat,那么输出就在canalina.out文件里。

如果jstack对你的应用不好使了,或者应用几乎没有响应了。使用kill -3是一种曲线救国的方式。

其实是JDK屏蔽了这个信号,对Java来说是一个福利。我们在JDK的文档中找到相关介绍。

Sun’s JVM catches signals to implement shutdown hooks for abnormal JVM termination. The JVM uses SIGHUP, SIGINT, and SIGTERM to initiate the running of shutdown hooks.

The JVM uses a similar mechanism to implement the pre-1.2 feature of dumping thread stacks for debugging purposes. Sun’s JVM uses SIGQUIT to perform thread dumps.

我这里有一个脚本,能够接受两个参数。第一个参数是pid,第二个参数是等待的秒数。

pid=$1

count=$2

n=0

if [ ! -n $count ];then

count=10

fi

while [[ $n -lt $count ]]

do

let "n++"

kill -0 $pid

if [ $? -ne 0 ]

then

echo "program not exist"

break

else

echo "send kill -15 to $pid"

kill -15 $pid

sleep 1

fi

if [[ $n -eq $count ]]

then

echo "kill -9 $pid"

# after 10s , try to send kill -9

kill -9 $pid

fi

done

脚本将持续使用kill -0判断进程是否存在,然后持续发送kill -15指令。等超过指定的秒数,进程依然存在,则最终发送kill -9命令。

问题是,通常情况下,你还是需要等待上几秒。自动化机器人不会觉得烦,你会。

所以你还是用kill -9。

作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决stackoverflow打开慢不能注册登录

http://blog.csdn.net/dream_an/article/details/50280977 解决stackoverflow打开慢不能注册登录 标签: stack overflowfirefox扩展打不开 2015-12-13 09:16 131人阅读 评论(2) 收藏 举报 分类:综合(6) 作者同类文章X版权声明&a…

PerlRegex堆栈溢出的问题

PerlRegex一直用得很顺手,但今天晚上却老是出现堆栈溢出的问题,调整了Delphi 的Max stack size后,仍然解决不了。 后来发现是正则表达式的问题,具体细节问题还不太清楚 我一般使用“((.|\n)?)”来匹配多行文本,而出现…

《架构之美》学习随笔:好的架构

好的架构是很多因素的结果,包括以下方面: 1、确定进行有意为之的前端设计 2、设计者的素质和经验 3、在开发过程中,保持清晰的设计观点 4、授权团队负责软件的整体设计,而团队也承担起这一责任 5、不要害怕改变设计:没…

halcon 旋转_HALCON高级篇:3D相机标定(3/3)

访问标定结果算子calibrate_cameras的主要结果由相机内参和每一张图像标定板的位姿组成。算子将它们存储在标定数据模型中,可以用算子get_calib_data来访问它们。相机外参并不能直接被获取,因为所需的世界坐标系统的信息没有存储在标定数据模型中。然而&…

java实现poi导入excel_Java POI实现将导入Excel文件的示例代码

问题描述现需要批量导入数据,数据以Excel形式导入。POI介绍我选择使用的是apache POI。这是有Apache软件基金会开放的函数库,他会提供API给java,使其可以对office文件进行读写。我这里只需要使用其中的Excel部分。实现首先,Excel有…

JS中双引号单引号,转义字符问题!!

investListHtml <div class"targetBlock"> <p> targetClass <span>总金额 <i> loanAmount </i> 元&#xff0c;剩余可投 <i> (loanAmount-collectAmount) </i> 元</span></p> <div class"targetCon…

什么叫n+1次select查询问题?

在Session的缓存中存放的是相互关联的对象图。默认情况下&#xff0c;当Hibernate从数据库中加载Customer对象时&#xff0c;会同时加载所有关联的Order对象。以Customer和Order类为例&#xff0c;假定ORDERS表的CUSTOMER_ID外键允许为null&#xff0c;图1列出了CUSTOMERS表和O…

OGRE 入门 二、Basic Tutorial 1 : An introduction to the most basic Ogre constructs

1. 下载源代码及脚本 这里有一个‘Convenient All-In-One’ 版的框架。 2. 创建场景 解压clean_ogre_cmake_project.zip&#xff0c;修改TutorialApplication.cpp中的函数&#xff1a; 1 void TutorialApplication::createScene(void)2 {3 // create your scene here :)4 …

React Native 重新建项目遇到的一些问题

1、基本上一句话&#xff0c;就是本地的node太旧了&#xff0c;跟不上React_Native的节奏&#xff0c;所以需要更新node&#xff0c;但是单纯的更新node丫丫竟然不让我跟&#xff0c;因为是用Homebrew来管理的&#xff0c;所以先update了下brew brew update && brew up…

picACG本地缓存目录_手机上本地存储的哪些文件、文件夹不能删?

手机、电脑随着不断的使用&#xff0c;系统本身、系统工具、第三方应用都会不断产生一些临时文件和垃圾文件。手机产生的垃圾文件更是显得杂乱无章&#xff0c;虽然可以使用系统自带或第三方应用来清理垃圾&#xff0c;但在本地存储还是有大量的文件夹或文件是可以手动删除的。…

python元组和列表的联系_Python元组与列表的区别和联系?

1.元组和列表比较相似&#xff0c;不过它们之间也有着不同&#xff1a; &#xff08;1&#xff09;列表&#xff1a;一个大仓库&#xff0c;你可以随时往里边添加和删除任何东西。 &#xff08;2&#xff09;元组&#xff1a;封闭的列表&#xff0c;一旦定义&#xff0c;就不可…

java的日期操作_java中对时间的操作详解

代码演示&#xff1a;//数据库中去的日期Date s list.get(0).getSdate();System.out.println(s);// Tue Apr 28 00:00:00 CST 2015//手动newDate d new Date();System.out.println(d);// Tue Apr 28 20:53:15 CST 2015System.out.println("" s.after(d));//使用Ca…

1个多月就能看到效果的减肥大法 - 健康程序员,至尚生活!

减肥方法很多。选择减肥方法时应以物理减肥和减少饮食为主。不应该以口服药物为主。常用减肥方法有&#xff1a; ① 预防性减肥&#xff1b; ②运动减肥&#xff1b; ③行为减肥&#xff1b; ④机械减肥&#xff1b; ⑤ 桑那浴减肥&#xff1b; ⑥石膏减肥&#xff1b; ⑦石腊减…

pytorch自带网络_PyTorch机器学习笔记(1)整好环境

2020年1月1日炼丹第0步&#xff0c;装好环境系统 Ubuntu 18.04 LTS先装上conda&#xff08;自带大多数科学计算基础包&#xff0c;以及比较优秀的包管理系统&#xff09;&#xff1a;国内网络环境建议到清华大学镜像站下载&#xff1a;Tsinghua Open Source Mirror​mirror.tun…

Atom与markdown

简述 Atom是github开发的开源跨平台的编辑器&#xff0c;Atom的强大可以与大名鼎鼎的Sublime Text相媲美。因为使用过Sublime Text&#xff0c;所以用Atom上手很快。这篇文章主要介绍使用Atom写markdown。之前在项目开发中都是使用.doc文件作为接口文档的载体&#xff0c;但是在…

java 正则匹配 sql星号,正则表达式匹配星号和换行符之间的字符串

Example:blah blah * Match this text Match this textMatch this textMatch this textMatch this text*more text more textHow to get string from inside the asterisk with the line breaks?解决方案You can use a negated match here. Notice that I escaped \ the liter…

Effective C# Item22:使用事件定义外发接口

事件为类型定义了外发接口&#xff0c;C#的事件是建立在委托的基础上的&#xff0c;委托为事件处理器提供了类型安全的函数签名。 委托要比事件的使用范围广泛&#xff0c;我们可以把事件看做是一种经过了封装的委托&#xff0c;专门用于事件驱动模型。你可以在客户代码中直接调…

【VC6.0】getline需要输入2次回车才会结束的BUG修复方法

今天看CPrimer的时候发现一个问题&#xff0c;getline需要输入2次回车才会显示结果&#xff0c;上网找了一下&#xff0c;发现是VC6.0的原因&#xff0c;修复原因如下&#xff1a; &#xff08;1&#xff09;建立一个1.CPP &#xff08;2&#xff09;输入#include <string&g…

Hash(LCP) || 后缀数组 LA 4513 Stammering Aliens

题目传送门 题意&#xff1a;训练指南P225 分析&#xff1a;二分寻找长度&#xff0c;用hash值来比较长度为L的字串是否相等。 #include <bits/stdc.h> using namespace std;typedef unsigned long long ull; const int N 4e4 5; const int x 123; ull H[N], _hash[N]…

2009小记

也许这个总结早就应该写了&#xff0c;不过按照学生的时间表&#xff0c;现在写也还说的过去&#xff0c;呵呵 到现在转到计算机这个专业好像已经好几年了&#xff0c;学了很多很多的东西&#xff0c;不过老觉得还是浮在表面上&#xff0c;没有真正的进入深层次的学习。也许我并…