研究JVM也有一段时间了,其间也发现了它的很多不足之处,在此一一道来,由于本人对JVM的理解有限,如有错误的地方,还请大家指正;本文不介绍名词性术语和概念性知识,如有不了解的地方可Search Google或者参考一些JVM相关的书籍;

1. 众所周知,所有Java类的元数据在经编译之后,会被保存到Class文件里,个人认为这是一个很扯淡的想法,原因如下:

  • 整个Class文件显得很臃肿,我们在非产品环境中所有的调试信息,如JVM指令与源代码行的对应信息,也会被保存在Class文件里;
  • 降低了获取元数据的速度,比如我们要获取一个包中所有标注了某个Annotation的类(使用Spring MVC时标注了@Controller的Java类),必须加载这个包中所有公共类的Class文件,然后再一一遍历;
  • 无法在不加载Class文件的情况下,获取类型的元数据信息;我们有时候会想得到一个第三方库中的信息,但是不能确定这些包中是否包含了恶意代码,如果加载这些Class文件,势必会执行初始化,这会给恶意代码制造了破坏整个应用程序的机会。[注:这里我说得有问题,事实上是可以做到的]

2. JVM指令有限,虚拟机规范指明在Class文件中每个指令保存为一个字节,也就是说虚拟机中最多允许存在256个指令,这在JVM诞生时,明显足够了;但是计划跟不上变化,随着技术的不断进步,新的特性会越来越多的出现在Java体系中,这些特性需要来自虚拟机层面的支持,因此要求增加更多的虚拟机指令(如JDK1.7为增加对动态语言的支持而新增的invokedynamic),但由于指令空间的局限性导致JVM发展有限。

3. 不合理的范型设计,Java采用了伪范型的方式来支持对集合算法的封装,而在编译之后所有的范型类型参数会被擦除为Object,我无法考证设计者基于什么样的考量而采用这种方式,但从某本书中获得这样的讯息:采用擦除的方式避免了“代码爆炸”的危险;这样的说法明显存在一些问题:

  • 动态生成运行时代码的地方有很多,比如运用得最广的动态代理技术,即在java.lang.reflect.Proxy中,使用了ProxyGenerator.generateProxyClass来为特定接口生成形式为“*$Proxy”的代理类的二进制字节流;
  • 无论运行时生成的代码还是编译时生成的代码,都保存在永久代中(以HotSpot VM为例),而JVM也会在内存不足的情况下对永久代进行回收,所以一般情况下不会出现代码爆炸的危险。

4. 垃圾回收发生的时间问题;我所理解的垃圾回收,应该在三种情况下发生:

  • 内存不足(这里所说的内存不足,都是指分配到某个代上对象的大小超过了该代的容量限制);
  • 代码调用System.gc();
  • 虚拟机根据运行时环境自动触发;

但据我所了解,很多虚拟机只支持前两者,这样虽然减少了GC执行的频率,但是却增多了由于JVM在垃圾回收时停顿所有线程而导致应用程序无响应的危险。

谈谈我印象中的JVM不足之处的更多相关文章

  1. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  2. 谈谈MVC项目中的缓存功能设计的相关问题

    本文收集一些关于项目中为什么需要使用缓存功能,以及怎么使用等,在实际开发中对缓存的设计的考虑 为什么需要讨论缓存呢? 缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源(例如数据 ...

  3. java环境中基于jvm的两大语言:scala,groovy

    一.java环境中基于jvm的两大语言:scala,groovy 可以在java项目里混编这两种语言: scala:静态语言,多范式语言,糅合了面向对象.面向过程:可以与java和net互操作:融汇了 ...

  4. 明白生产环境中的jvm参数

    明白生产环境中的jvm参数 写代码的时候,程序写完了,发到线上去运行,跑一段时间后,程序变慢了,cpu负载高了--一堆问题出来了,所以了解一下生产环境的机器上的jvm配置是有必要的.比如说: JDK版 ...

  5. JAVA代码中获取JVM信息

    一.JAVA中获取JVM的信息 原理,利用JavaSDK自带的ManagementFactory类来获取. 二.获取信息 1.获取进程ID @Test public void test1() { Ru ...

  6. Eclipse 中设置JVM 内存

    Eclipse 中设置JVM 内存 今天在eclipse 中测试把文档转换为图片的时候,报出了下面的错误: java.lang.OutOfMemoryError: Java heap space 从上 ...

  7. (转)谈谈RTP传输中的负载类型和时间戳

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ticktick.blog.51cto.com/823160/350142 最近被 ...

  8. 谈谈Vue/React中的虚拟DOM(vDOM)与Key值

    谈谈Vue/React中的虚拟DOM(vDOM)与Key值 一.DocumentFragment 在了解虚拟DOM前,先来了解DOM的一个对象属性--DocumentFragment. 在一次操作中, ...

  9. 零元学Expression Blend 4 - Chapter 7 什麽?影片不再是印象中的方框框!!!看Blend 4如何把影片镶入字里

    原文:零元学Expression Blend 4 - Chapter 7 什麽?影片不再是印象中的方框框!!!看Blend 4如何把影片镶入字里 本章将教大家如何在Blend 4里新增Media El ...

随机推荐

  1. JS base64 加密和 后台 base64解密(防止中文乱码)

    直接上代码 1,js(2个文件,网上找的)  不要觉的长,直接复制下来就OK //UnicodeAnsi.js文件 //把Unicode转成Ansi和把Ansi转换成Unicode function ...

  2. python实现之决策树

    一.Predict survival on the Titanic 使用泰坦尼克号上的乘客数据,对乘客是否存活进行预测 1.观察数据集合 可能遇到的问题 训练集和测试集特征值得属性并不重合.连续属性和 ...

  3. JavaScript如何使用this

    学习this的使用必须牢记以下两点 1.this是一个只能在函数内部使用的关键字 2.this指向调用函数的那个对象 下面我们来具体讨论一下this的具体使用方法 第一种:通过函数调用的方式----- ...

  4. CSS 学习笔记

    0.CSS概念层叠样式表(Cascading Style Sheets),CSS的来历就不必多说了.可以简单的理解为万维网联盟(w3c)为了丰富HTML页面的布局和外观而指定的一种标准. 1.CSS实 ...

  5. 真机测试及布署Code Sign error问题总结

    Code Sign error: Certificate identity 'iPhone Developer: idf (XR9HN3TD7E)' appears more than once in ...

  6. vert.x学习(六),动态模板与静态文件的结合

    这篇学习在动态模板里面引入css,把动态模板与静态文件结合起来使用. 编写DynamicReference.java package com.javafm.vertx.helloworld; impo ...

  7. Angular-表单动态添加删除

    angular本身不允许去操作DOM,在angular的角度来说,所有操作都以数据为核心,剩下的事情由angular来完成.所以说,想清楚问题的根源,解决起来也不是那么困难. 前提 那么,要做的这个添 ...

  8. C++ 环形缓冲区的实现

    参考文章:http://blog.csdn.net/linyt/article/details/53355355 本文参考linux系统中 kfifo缓冲区实现.由于没有涉及到锁,在多线程环境下,只适 ...

  9. php token的生成

    转载自:http://blog.snsgou.com/post-766.html --->非开放性平台 --->公司内部产品 接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的 ...

  10. 给inpu加背景图,input内容又不能盖着背景图

    问题: 根据需要,给input添加背景图片,又需要点击input及input的这个背景触发事件,但是给input输入内容多时,会覆盖此背景(如下图), 图中,java人员使用插件省市区三级联动,需要i ...