@
morgan1freeman #20 另外怕你听不懂什么叫做实时性,举个简单的例子就是,你的代码 执行一段时间,然后会停顿下来(物理时间意义上的停顿,在你的程序本身看来 它是连续执行的),然后让 JVM 的代码接管,这个时候 它会去处理内存是否回收利用的问题
至于上楼所说的 safepoint 你可以参考这个
https://github.com/fqdeng/jvm-suspend-working-thread-mechanism这是我写的例子,主要 JVM 是用了 mprotect 内存回调函数,当机器读内存取指令的时候 会触发一次回调,逻辑流会被 JVM 接管,JVM 接管后 处理完,才是你的 java 代码 开始执行
至于 safepoint 怎么实现,字节码的时候,就直接下 埋点,字节码跑到那里 就把逻辑流切到 JVM 看看是否要做清理动作,如果编译成了 二进制汇编码,就是上述的 mprotect 函数 进行埋点,等你的程序执行到位了,mprotect 就会接管你的 java 代码逻辑流,切换到 JVM 代码
早些年虚拟机代码 可能有些问题,有的地方 没下埋点,结果这 java 线程 跑到系统调用,没有在系统调用前 塞 safepoint 或者其它运算 一直 for 个不停,但是每次 for 里面{} 又没有塞 safepoint 的 这个时候,java 线程停不下来,JVM 没法进行图分析,现在基本上不用操心这个问题了,
前几年 golang 也出现过这个问题,貌似后面官方也迅速解决了,
总而言之,基础是图论算法,后续都是根据工程实践 延伸的知识