以下为知识DOC为大家进行整理的相关内容,希望对大家有所帮助!
Stop The World机制简称STWjvm是什么意思,从字面意思也能很直观的知道STW是什么意思:停止整个世界,STW会把Java程序除了垃圾回收线程以外的所有线程全部挂起,整个程序看上去就好像处于停止状态了。
学习Java的朋友肯定都知道Java在运行时会进行垃圾回收(GC)操作,在进行垃圾回收操作的时候就有可能会进入STW状态,当然还有一些其它情况也会进入STW状态,我们就以最常见的GC来分析一下JVM是如何Stop The World的。
为什么要Stop The World
在分析STW的实现原理之前,我们先看看为什么GC的时候需要STW。
以打扫房间为例:
找出所有的垃圾,然后丢弃。把需要留下的东西整理整齐。
在我们打扫房间的时候如果其他人乱摆弄东西、乱扔垃圾jvm是什么意思,将会导致我们的白白忙活了。所以这个时候要大声告诉大家:不要动(Stop The World)。
Stop The World会导致什么问题
既然已经Stop The World了,那么影响也是显而易见的:STW的时候程序会不干活,导致程序无响应。
既然STW会影响到程序响应,那么显然STW的时间越短越好了,所以会引起STW的Full GC的持续时间是Java服务器性能的一个重要指标。
JVM的
在讲STW的原理之前,我们需要先了解JVM中另外一个概念:-安全点。
可以认为是一段特殊的代码,当Java线程执行进入这段代码就表面虚拟机的状态是安全的,是可以进行GC等要求STW状态的操作。
由于GC是可能在任何时候由任何Java线程引起的(只要堆内存不足时),所以当JVM发起GC的时候并不是立马暂停所有的Java线程的,而是会让Java线程继续执行到最近的一个后再暂停,等所有Java线程都Stop以后再进行GC。
中采用了两种方式来确定线程有没有到达安全点:
的实现代码
下面是安全点检测代码:
上面的代码定义了宏,只需要把这个宏插入到Java代码合理的位子就可以了。
上面的代码可以看出,当线程执行到安全点时会先判断一下当前的状态,如果状态为时就会调用block程序来阻塞当前线程。
Java线程是如何被阻塞的
上面讲了安全点会根据需要进入线程阻塞代码,接下来我们再看看线程是如何被阻塞的:
删除了很多不相干的代码和注释后jvm是什么意思,我们可以发现block函数中会等待锁的释放,只要这个锁一直不释放,线程就一直会处于挂起状态,也就是达到了我们想要的STW效果。
STW是如何发起的
前面一篇文章介绍过的.gc()触发Full GC的时候我们介绍了可以往线程中添加来让虚拟机完成一些操作,其中GC都是这么发起的,其实STW也是在循环线程中开启和结束的。当发现某个需要在中执行时就会开启STW,当执行结束后就会关闭STW。具体代码如下:
然后我们看看begin代码:
在begin函数中不只是会设置锁,还会挂起线程,Java线程不同的状态挂起方式也是不一样的,由于设置过程比较复杂这里就不再贴代码:
线程是如何被唤醒的
通过begin方法可以挂起线程、Stop The World,对应的唤起线程使用的是end方法。唤醒大概过程为:
本文地址: https://www.zhishidoc.com/22897.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 859089669@qq.com 举报,一经查实,本站将立刻删除。