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来怎么治愈自己,说实在的也就是写个程序玩玩吧,真正写商业程序,死都不知道死到哪儿去。
相关推荐
### Java程序设计基础教程知识点详述 #### 一、Java语言概述 - **Java语言的起源与发展** - **诞生背景**:Java语言由Sun Microsystems公司于1995年推出,最初是作为Oak项目的一部分开始研发。Oak项目旨在开发一...
Java学习笔记中可能包含了对Java语言的深入理解和实践技巧,包括设计模式、并发编程、JVM内存模型、垃圾收集机制、性能优化等方面。这些知识能帮助你在实际项目中写出高效、可维护的代码。 面试题类型通常包括但不...
通过研究这个Java计算器项目,开发者不仅可以了解基础的Java编程,还可以深入学习GUI设计、事件处理和异常管理等进阶主题,对于提升Java编程技能大有裨益。同时,对于初学者来说,这是一个很好的实践项目,因为它...
7. **JDK(Java Development Kit)**:它是Java开发的基础,包含了编译器、JVM(Java虚拟机)和各种工具。熟悉JDK的使用和配置,能帮助开发者编写、运行和调试Java程序。 8. **jQuery**:这是一个轻量级的...
JDK(Java Development Kit)是Java语言的核心开发工具包,包含了Java运行环境(JRE)、Java虚拟机(JVM)、Java编译器、Java类库等核心组件。JDK 1.7(即Java SE 7)是Oracle公司发布的一个重要版本,于2011年7月28...
这些参数主要影响IDEA自身的启动和运行过程,也会影响到部署在IDEA上的应用程序的性能。例如,在描述部分提到的`-Xms256m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m`就是典型的JVM参数配置。 - **-Xms256m...
在Java开发中,Redis是常用的后端数据存储解决方案之一,因此了解Redis的基本概念、操作和与Java的交互方式至关重要。 Redis支持的数据结构包括字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)和...
JDK提供了编译Java源代码所需的javac编译器,以及运行Java程序的Java虚拟机(JVM)。开发者还需要JRE(Java Runtime Environment),这是运行Java应用程序所必需的基础组件。 在压缩包内,"开发环境战神"可能包括一...
在Java编程环境中,将一个.jar(Java Archive)文件转换为可执行文件,通常是将它封装成Windows下的.exe可执行程序,以便非Java开发者也能轻松运行。这个过程涉及到几个关键步骤和工具,以下是一个详细的教程: 1. ...
SSH(Secure Shell)是一种网络协议,用于在不安全的网络环境中提供安全的远程登录和其他服务。在本文中,我们将深入探讨SSH2错误的学习记录,主要包括以下几个方面: 1. **@Autowired注解问题**: `@Autowired`是...
"Clojure" 是一种基于 Lisp 的现代函数式编程语言,它运行在 Java 虚拟机(JVM)上,拥有强大的并发处理能力和简洁的语法。由于 "clipbot" 使用 Clojure 开发,我们可以推断出该机器人利用了 Clojure 的这些优势,...