加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 多个JVM与并发任务

发布时间:2020-12-14 19:14:08 所属栏目:Java 来源:网络整理
导读:我正在将胖客户端代码移植到具有瘦客户端的服务器架构中. 服务器需要为每个客户端运行一个代码实例.代码是多线程的,可以运行很长时间(数周),但只是偶尔与客户端进行交互.客户数量将达到数千.每个客户端需要大约20MB的堆. 我现在有两种选择, 在服务器上为每个

我正在将胖客户端代码移植到具有瘦客户端的服务器架构中.

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

我现在有两种选择,

>在服务器上为每个客户端启动一个单独的JVM
>修改我的代码,以便在每个客户端的共享空间中完成所有请求和计算(如在Web应用程序中)

我可以看到每个人的利弊.对于多个JVM:

优点:

>进程是分开的,如果一个挂起只是杀死它并重新启动.所有其他人都不在乎.
>资源可以被限制,这样一个客户端就不能吃掉所有的CPU /内存
>轻松分布在多台机器上

缺点:

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

您有推荐的最佳做法吗?

你知道有关这个问题的任何好的参考书/文章吗?

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

最佳答案
遗憾的是,在单个JVM中以线程为基础限制资源是不可能的.但是,我仍然会尝试将您的应用程序移植到单个JVM中,原因如下:

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读