让我们以嵌入到某个 tomcat 容器中的 spring 应用程序为例。我知道 spring 在它的掩护下使用 servlet,但我想从 JVM 的角度了解它的内部工作原理。什么直接与 JVM 通信?
独立的“静态”应用程序案例很简单,因为代码被编译一次,字节码由 JVM 解释/由 JIT 编译,类被加载并且与外界没有交互 - 我们可以说应用程序是“调用一次”何时开始。
但是当涉及到可以与用户进行一些交互等的应用程序时,使用 spring 循环运行,JVM 如何知道某些方法是通过请求(即“localhost:8080/users”)调用的? JVM 正在监听某个端口?从套接字读取?哪个组件负责它?
如果能写出从应用程序启动、用户请求到与 JVM 交互以及其中发生的情况的整个路径,我将非常感激。
最佳答案
首先,您的问题非常宽泛,不适合 StackOverflow。
简而言之,JVM 与任何其他操作系统进程没有什么特殊之处。您(或您的供应商)编写 Java/C/Go/Python/任何监听套接字的代码。
当传入的网络请求到来时,操作系统“通知”进程(您正在运行的程序)有新数据,以便它可以解释它并以任何它想要的方式使用react(例如将用户数据保存到数据库中,返回正确的响应)。
用于与操作系统特定设施(如套接字)进行交互的 Java/JVM 代码是用 native 代码(即 C/C++)编写的,并由 JVM 提供给您的 Java通过包装器(“ native 方法”)进行编程。
例如,有一个内部 PlainSocketImpl.java
类,其中包含在相应 PlainSocketImpl.c
native 代码中实现的一堆 native 方法: https://github.com/AdoptOpenJDK/openjdk-jdk14/blob/master/src/java.base/unix/native/libnet/PlainSocketImpl.c
(例如 socketAccept
实现: https://github.com/AdoptOpenJDK/openjdk-jdk14/blob/master/src/java.base/unix/native/libnet/PlainSocketImpl.c )
我建议你找到一个关于通用套接字编程的好资源;您可能会发现这些很有用:
关于java - JVM 如何对用户的请求使用react,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60694147/