首页 > 解决方案 > JVM 如何对用户的请求做出反应

问题描述

让我们以嵌入在某个 tomcat 容器中的 spring 应用程序为例。我知道 spring 在它的掩码下使用 servlet,但我想从 JVM 的角度了解它在内部是如何工作的。什么直接与 JVM 通信?

独立的“静态”应用案例很简单,因为代码编译一次,字节码由 JVM 解释/由 JIT 编译,加载类并且与外界没有交互——我们可以说应用程序在启动时“调用一次”。

但是当涉及到可以与用户等进行交互的应用程序时,循环运行,使用ie spring,JVM如何知道通过请求ie“localhost:8080/users”调用了某些方法?JVM 正在监听某个端口?从套接字读取?哪个组件负责它?

我将非常感谢编写从应用程序开始、用户请求到与 JVM 交互以及它上面发生的事情的整个路径。

标签: javaservletsjvm

解决方案


首先,您的问题非常广泛,不适合 StackOverflow。

简而言之,JVM 与这里的任何其他操作系统进程都没有什么特别之处。您(或您的供应商)编写了一个 Java/C/Go/Python/whatever 代码来侦听socket

当传入的网络请求到来时,操作系统“通知”进程(您正在运行的程序)有新数据,以便它可以解释它并以它想要的任何方式做出反应(例如将用户数据保存到数据库中并返回适当的回复)。

用于与操作系统特定设施(如套接字)交互的 Java/JVM 代码是用本机代码(即 C/C++)编写的,并由 JVM 通过包装器(“本机方法”)提供给您的 Java 程序。例如,有一个内部类,在相应的本机代码PlainSocketImpl.java中实现了一堆本机方法: https ://github.com/AdoptOpenJDK/openjdk-jdk14/blob/master/src/java.base/unix/native/libnet/ PlainSocketImpl.c (例如实现:https ://github.com/AdoptOpenJDK/openjdk-jdk14/blob/master/src/java.base/unix/native/libnet/PlainSocketImpl.c )PlainSocketImpl.csocketAccept

我建议你找到一个关于通用套接字编程的好资源;您可能会发现这些很有用:


推荐阅读