一般来说,线程如果因为非法访问内存引发崩溃,那么进程也会崩溃,因为各个线程的地址空间共享,非法访问内存会影响其他线程,引发严重后果。
进程如何崩溃
进程崩溃是通过信号实现的,常用的 kill -9 就是直接给指定进程 pid 发送终止信号 9。
C/C++ 中线程崩溃导致进程崩溃的原因
- 非法内存访问:如果线程因为非法访问内存(如访问未分配的内存、写入只读内存等)而崩溃,操作系统会发送
SIGSEGV信号给进程。默认情况下,操作系统会终止整个进程,因为这种错误可能会导致进程的地址空间处于不稳定状态,影响其他线程的运行。 - 信号处理机制:操作系统通过信号机制处理线程的崩溃。如果进程没有定义自己的信号处理函数,操作系统会执行默认的信号处理程序,导致进程退出。
Java 中线程崩溃不会导致 JVM 崩溃的原因
- JVM 的信号处理机制:JVM 定义了自己的信号处理函数,拦截了
SIGSEGV等信号。当线程崩溃时,JVM 会捕获这些信号,并进行内部处理,而不是直接终止整个进程。 - 异常处理机制:在 Java 中,线程崩溃通常会抛出异常(如
NullPointerException或StackOverflowError)。JVM 会捕获这些异常并进行处理,而不是直接终止整个 JVM。