从jvm的自愈说起-设计JVM的疯子和写java程序的疯子_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 从jvm的自愈说起-设计JVM的疯子和写java程序的疯子

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

 2014/12/18 15:32:56  windshome  程序员俱乐部  我要评论(0)
  • 摘要:http://it.deepinmind.com/jvm/2014/12/15/self-healing-jvm.html这里说了一个观点,叫做JVM的自愈能力,就是说JVM在遇到问题时会自己发现问题解决问题,举例如下:packageeu.plumbr.test;publicclassHealMe{privatestaticfinalintSIZE=(int)(Runtime.getRuntime().maxMemory()*0.6);publicstaticvoidmain
  • 标签:程序 Java 疯子 设计 JVM

?

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

?

?

class="java" style="margin: 0px; padding: 0px;">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来怎么治愈自己,说实在的也就是写个程序玩玩吧,真正写商业程序,死都不知道死到哪儿去。

?

?

?

?

?

发表评论
用户名: 匿名