《深入JAVA虚拟机》一书中介绍,每一个JAVA应用程序都创建一个虚拟机实例,并运行在这个实例里,通过给虚拟机实例配置xmx改变堆内存大小。我突然想到,能否让一个虚拟机实例里的运行的应用程序所调用的类运行在另一个虚拟机实例里?
这个很有现实意义,用处最大就在J2EE缓存,大家都知道应用服务器给JVM分配的堆内存不可能无限制涨大,例如到2G后就无法再大,可是服务器可能有8G内存,另外6G浪费了?(如果再跑其他应用恐CPU不够,跑单机集群就是利用另外6G内存再装3个应用服务器),我在想,2G已经很小了,能不能将缓存这样的“有了更好,没有也没事”的东西让其运行在另一个虚拟机实例里(占用另外6G内存空间),而不与2G的核心数据存储争抢空间。如果说之前调用缓存管理器  CacheManager.getInstance()这样的话,换成Runtime.exec("CacheManager.jar");......是不是相当于将其运行在另一个JVM中?

解决方案 »

  1.   

    确实又将启动一个jvm,但是两个jvm没用办法直接通信,其实要解决内存浪费的问题也很简单,你跑两个jvm一个用于业务系统,一个用于缓存,他们之间通过远程调用就可以了,比如web serivices等等,很多手段.
      

  2.   

    无法直接通讯,这也是java的安全性决定的,否则太不安全了。只能通过
    1 端口,比如RMI,Socket,WebService等...
    2 文件
    3 共享内存等进行数据交换
      

  3.   

    是跑在不同jvm中的
    如果要互相通信的话 
    用支持分布式的东西
    rmi
      

  4.   

    无法直接通讯,但可以使用RMI,WEB SERVICES等手段来达到目的。
      

  5.   

    支持分布式,顺便:单机情况下,一机开多个进程互相进行socket通讯算是分布式么?
      

  6.   

    楼主标题中的要求是没法做到的。操作系统可以运行多个 JVM,一个 JVM 可以运行多个 ClassLoader,而类是运行在 ClassLoader 下的。关系很复杂,所以要利用网络或文件来相互通讯才行。