欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

从jvm的自愈说起-设计JVM的疯子和写java程序的疯子

程序员文章站 2022-07-03 16:55:55
...

 

http://it.deepinmind.com/jvm/2014/12/15/self-healing-jvm.html这里说了一个观点,叫做 JVM的自愈能力,就是说JVM在遇到问题时会自己发现问题解决问题,举例如下:

 

 

package eu.plumbr.test;

public class HealMe {
  private static final int SIZE = (int) (Runtime.getRuntime().maxMemory() * 0.6);

  public static void main(String[] args) throws Exception {
    for (int i = 0; i < 1000; i++) {
      allocateMemory(i);
    }
  }

  private static void allocateMemory(int i) {
    try {
      {
        byte[] bytes = new byte[SIZE];
        System.out.println(bytes.length);
      }

      byte[] moreBytes = new byte[SIZE];
      System.out.println(moreBytes.length);

      System.out.println("I allocated memory successfully " + i);

    } catch (OutOfMemoryError e) {
      System.out.println("I failed to allocate memory " + i);
    }
  }
}

按照道理,总是这样分配内存一定会内存不足,报OOM异常的,但是,文章提到,在JVM8中,在运行了256次allocateMemory()方法2之后,C1编译器会将这个方法进行3级编译。它会一次性查看整个方法,因此它能推断出后面不会再用到bytes变量,可以对它进行GC。所以才会触发垃圾回收,因此程序才能奇迹般地自愈。

 

我想说的是:设计这样JVM的人和在真正产品实现里写这样代码的人都是疯子。


前者是越俎代庖,非要管人家上层程序员的事:你就是一个VM,一个底层,上层要你干啥你就干啥,自作主张的给人家优化---就行秘书自作主张的改领导的批示一样。结果又两个,一是改了不大紧要的地方,可有可无,真正重要的地方改不了;二是改了让人家的业务过程变了,与预期不符。是在可笑之极。

---一句话:谁的逻辑除了bug谁负责,这还需要解释吗?家里养的猫不抓老鼠,就指望养的牛抓老鼠?

后者是疯子:你写个代码出这样的bug,自己找根绳去吧!有了bug自己不负责,指望jvm来怎么治愈自己,说实在的也就是写个程序玩玩吧,真正写商业程序,死都不知道死到哪儿去。