谈谈我印象中的JVM不足之处
研究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不足之处的更多相关文章
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 谈谈MVC项目中的缓存功能设计的相关问题
本文收集一些关于项目中为什么需要使用缓存功能,以及怎么使用等,在实际开发中对缓存的设计的考虑 为什么需要讨论缓存呢? 缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源(例如数据 ...
- java环境中基于jvm的两大语言:scala,groovy
一.java环境中基于jvm的两大语言:scala,groovy 可以在java项目里混编这两种语言: scala:静态语言,多范式语言,糅合了面向对象.面向过程:可以与java和net互操作:融汇了 ...
- 明白生产环境中的jvm参数
明白生产环境中的jvm参数 写代码的时候,程序写完了,发到线上去运行,跑一段时间后,程序变慢了,cpu负载高了--一堆问题出来了,所以了解一下生产环境的机器上的jvm配置是有必要的.比如说: JDK版 ...
- JAVA代码中获取JVM信息
一.JAVA中获取JVM的信息 原理,利用JavaSDK自带的ManagementFactory类来获取. 二.获取信息 1.获取进程ID @Test public void test1() { Ru ...
- Eclipse 中设置JVM 内存
Eclipse 中设置JVM 内存 今天在eclipse 中测试把文档转换为图片的时候,报出了下面的错误: java.lang.OutOfMemoryError: Java heap space 从上 ...
- (转)谈谈RTP传输中的负载类型和时间戳
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ticktick.blog.51cto.com/823160/350142 最近被 ...
- 谈谈Vue/React中的虚拟DOM(vDOM)与Key值
谈谈Vue/React中的虚拟DOM(vDOM)与Key值 一.DocumentFragment 在了解虚拟DOM前,先来了解DOM的一个对象属性--DocumentFragment. 在一次操作中, ...
- 零元学Expression Blend 4 - Chapter 7 什麽?影片不再是印象中的方框框!!!看Blend 4如何把影片镶入字里
原文:零元学Expression Blend 4 - Chapter 7 什麽?影片不再是印象中的方框框!!!看Blend 4如何把影片镶入字里 本章将教大家如何在Blend 4里新增Media El ...
随机推荐
- 实战Java虚拟机之四:提升性能,禁用System.gc() ?
今天开始实战Java虚拟机之四:"禁用System.gc()". 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟 ...
- 安卓中級教程(3):ScrollView
以上是scrollview的圖例,可見srollview是一種滑動功能的控件,亦是非常常見的控件. 一般寫法如下: package com.mycompany.viewscroller; import ...
- DevOps is dirty work - What's the deal
什么是DevOps?终于又回到这个最初的问题. 第一次看到这个词的时候,还身陷于各种敏捷概念轰炸中.用“身陷”这个词其实并不准确,因为那个年代的我也是那些热情洋溢地无处不宣传敏捷的热血文艺青年中的一员 ...
- 折腾一两天,终于学会使用grunt压缩合并混淆JS脚本,小激动,特意记录一下+spm一点意外收获
很长时间没有更新博客了,实在是太忙啦...0.0 ,以下的东西纯粹是记录,不是我原创,放到收藏夹还担心不够,这个以后常用,想来想去,还是放到这里吧,,丢不了..最后一句废话,网上搜集也好原创也罢,能解 ...
- Software Solutions CACHE COHERENCE AND THE MESI PROTOCOL
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION Software cache cohere ...
- URL转Drawable之 Android中获取网络图片的三种方法
转载自: http://doinone.iteye.com/blog/1074283 Android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Applicatio ...
- Spring的IOC原理(转载)
在网上看到一篇文章,感觉写得挺不错的,转载一下,本文转载自:http://www.cnblogs.com/xdp-gacl/p/3707631.html 一. IoC理论的背景 我们都知道,在采用面向 ...
- Angular-ngtable联动全选
之前于Angular第三方插件ngTable的官网demo上看到的例子,但苦于demo中联动全选为选中所有,项目中并不适用,因此做了下小小的修改,修改目的只是为实现其功能,方法不敢苟同,若有更加简便的 ...
- css 居中问题
水平居中有text-align:center 和 margin:0 auto,前者是针对父元素进行设置而后者则是对子元素.margin:0 auto; 这里实现的前提是子元素没有float 浮动起来, ...
- WordPress基础:自定义菜单
需要自定义一个菜单,可以访问后台->外观->菜单