java - 多个 JVM 与并发任务

标签 java jvm virtualization

<分区>

我正在将胖 Java 客户端代码移植到具有精简客户端的服务器架构。

服务器需要为每个客户端运行一个代码实例。该代码是多线程的,运行时间很长(数周),但只是偶尔与客户端交互。客户数量将达到数千。每个客户端需要大约 20MB 的堆。

我现在有两个选择,

  1. 在服务器上为每个客户端启动一个单独的 JVM
  2. 修改我的代码,以便所有请求和计算都在每个客户端的共享空间中完成(就像在网络应用程序中一样)

我可以看到每一个的优点和缺点。对于多个 JVM:

优点:

  • 进程是独立的,如果一个进程挂起就杀死它并重新启动。所有其他人都不会在意。
  • 可以限制资源,这样一个客户端就不会吃光所有的 CPU/内存
  • 轻松分布在多台机器上

缺点:

  • 多次加载完整的JRE类库
  • 不是 Java EE 的做事方式
  • 是否每个客户端都需要通过单独的端口进行通信?

您有推荐的最佳做法吗?

你知道关于这个主题的任何好的引用书/文章吗?

是否有一个框架只使用一个 JVM 但运行多个代码副本,就好像它是单独的进程空间(资源有限等)?

最佳答案

遗憾的是,不可能在单个 JVM 中以线程为基础限制资源。但是,出于以下原因,我还是会尝试将您的应用程序移植到单个 JVM 中:

  • 如果一个线程使用了很多 CPU,如果您正确地编写了任务代码,您仍然可以杀死它(interrupt() 是您的 friend )。
  • 如果有多个客户端与其他客户端同时工作,我认为它们无论如何都必须共享 CPU。
  • 线程运行了几个星期?无论如何,您都应该将任务拆分为子任务,这样您就可以从重新启动中恢复过来,并从您离开的地方继续您的工作。
  • 只有在单个应用程序中,客户端才能共享通信服务器端口。
  • 必须以某种方式以编程方式限制内存消耗。对于数据库,这意味着查询必须限制为固定数量的结果或类似的东西。
  • 如果每个进程只需要 20MB 的堆内存,那么单个应用程序需要的资源就会少得多。我认为每个 JVM 的开销约为 30MB,调度 1000 个线程可能比操作系统调度 1000 个进程的性能更高。
  • 如果您对应用程序进行编码以通过 JMX 提供信息,您将免费获得一个用于流程的监控控制台。如果您为每项任务启动一个流程,则更难监控。

使用单一应用程序方法,除非您真的无法控制用户可以启动哪些任务。

关于java - 多个 JVM 与并发任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5516009/

相关文章:

java - 如何让jvm在外部进行垃圾回收

virtualbox - 在 Windows 上的 VirtualBox 上运行的 Ubuntu 上启用 kvm

java - 使 @Transactional 和 @Rollback 与 Spring Boot Test 一起使用

java - 描述 资源路径 位置类型 与元素类型 "p"关联的属性 "p:sessionFactory-ref"的前缀 "beans:bean"未绑定(bind)

java - mahout - 运行 grouplens 示例错误

virtualization - 四核和虚拟机上的并行编程?

virtual-machine - 如何在 Virtual Machine Manager 中启用 QEMU-Monitor 控制台?

java - 删除节点时 UI 不更新

java - JVM 规范和 Java 编译器代码对 SCJP 准备有用吗?

java - 使用不同用户执行jstack导致Full GC