java - JVM 如何对用户的请求做出反应
问题描述
让我们以嵌入在某个 tomcat 容器中的 spring 应用程序为例。我知道 spring 在它的掩码下使用 servlet,但我想从 JVM 的角度了解它在内部是如何工作的。什么直接与 JVM 通信?
独立的“静态”应用案例很简单,因为代码编译一次,字节码由 JVM 解释/由 JIT 编译,加载类并且与外界没有交互——我们可以说应用程序在启动时“调用一次”。
但是当涉及到可以与用户等进行交互的应用程序时,循环运行,使用ie spring,JVM如何知道通过请求ie“localhost:8080/users”调用了某些方法?JVM 正在监听某个端口?从套接字读取?哪个组件负责它?
我将非常感谢编写从应用程序开始、用户请求到与 JVM 交互以及它上面发生的事情的整个路径。
解决方案
首先,您的问题非常广泛,不适合 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.c
socketAccept
我建议你找到一个关于通用套接字编程的好资源;您可能会发现这些很有用:
推荐阅读
- java - 通过工厂同步线程获取/创建
- c# - 禁用自动推送远程通知ios
- asp.net - 如何在转发器中的所有单元格上放置一个复选框?
- r - 使用 R 在数据集中的多列之间重新分配字符值
- c# - c#带有基本身份验证的http post请求
- javascript - 仅在 html 打印中删除/隐藏 tfoot 最后一页
- php - 如何限制 Woocommerce 产品描述中的图像?
- python - IndexError:列表索引超出范围/无法将数字附加到数组
- python - 每次应用程序运行或日志大小达到最大值或日期更改时,如何在 python 中生成一个新的日志文件?
- php - 如何将文本转换为 utf32 编码