宜阳县网站建设,张家港网站设计优化,如何对自己做的php网站加密,免费做网站的软件首先我们把两个概念讲清楚
OOM是线程在申请堆内存#xff0c;发现堆内存空间不足时候抛出的异常。
JVM退出的条件如下#xff1a; java虚拟机在没有守护线程的时候会退出。守护线程是启动JVM的线程#xff0c;服务于用户线程。
我们简单说下守护线程的功能:
1.日志的记录…首先我们把两个概念讲清楚
OOM是线程在申请堆内存发现堆内存空间不足时候抛出的异常。
JVM退出的条件如下 java虚拟机在没有守护线程的时候会退出。守护线程是启动JVM的线程服务于用户线程。
我们简单说下守护线程的功能:
1.日志的记录和监控 2.资源的管理和清理 3.定时任务执行 4.后台服务 5.JVM内部服务 更加详细的这里不做熬述
我们知道线程是计算机资源调度的基本单位我们去观察任何操作系统都是线程作为资源调度的基本单位在程序异常退出的时候不会操作系统关闭了。有人会说那我有时候打开应用程序的时候用着用着蓝屏了那是windows操作系统没处理好一些问题造成的。 同样JVM也是虚拟机遵从大部分计算机的设计理念java的设计线程的时候也充分考虑了线程的独立性。 所以在未捕获异常的情况下OOM是该线程异常中止执行JVM并不会异常退出。这两个算是两个不同的操作没有必然的联系。
有人会说那为什么我写一个让JVM OOM的程序触发之后JVM就退出了呢那是因为我们在main函数执行的主线程中触发的OOM线程退出就是main函数退出当然JVM在main函数退出之后做完相关的处理之后JVM接着退出了。
我们现在做个总结:
在我们在main函数内部启动的线程发生OOM的时候该线程退出线程池OOM线程池创建的线程结束。要主线程无关并且JVM不会退出
什么时候OOMJVM会退出呢
1:所有的非守护线程由于申请不到内存而OOM所有非守护线程退出JVM退出这个属于主动退出 OOM的发生表示了此刻JVM堆内存告罄不能分配出更多的资源或者GC回收效率不可观。 一个线程的OOM在一定程度的并发下若此时其他线程含非守护线程也需要申请堆内存那么其他线程也会因为申请不到内存而OOM甚至连锁反应导致整个JVM的退出
2:OOM溢出说明内存耗尽如果操作系统内存耗尽就会发生OOM killer(Out OfMemory killer)干掉JVM进程导致被动退出
Linux 内核有个机制叫OOM killer(Out Of Memory killer)该机制会监控那些占用内存过大尤其是瞬间占用内存很快的进程然后防止内存耗尽而自动把该进程杀掉。内核检测到系统内存不足、挑选并杀掉某个进程的过程可以参考内核源代码linux/mm/oom_kill.c当系统内存不足的时候out_of_memory()被触发然后调用select_bad_process()选择一个”bad”进程杀掉。如何判断和选择一个”bad进程呢linux选择”bad”进程是通过调用oom_badness()挑选的算法和想法都很简单很朴实最bad的那个进程就是那个最占用内存的进程