Java虚拟机知识提炼

快速的过了一本Java虚拟机的书,还是很有意思的。

用自己的话小结一下,太细节的内容就不提了。

第一,java在诞生之初是冲着代码的可移植性去的,所以,设计了这种平台无关的中间编码和解释执行代码的运行环境,也就是java虚拟机。所以,java一开始就公布了两个规范,一个是java语言规范,另一个是java虚拟机规范,是两个分开的规范。
靠,什么意思,就是说,你只要研究透虚拟机规范,就可以自己写java虚拟机,就可以执行编译后的class文件啊。实际上,确实有很多公司和组织在开发java虚拟机。再说一个事情,那就是Java虚拟机是C++写的。伟哉,我大C++!不过Java这个后生也不是吃素的,Java的使用广泛程度大大超过C++和C。好厉害!

考虑到Java的广泛影响力,所以,早期写Java虚拟机是一件多么牛逼的事情,现在最主流的HotSpot VM,也是Sun把某个比较牛逼的虚拟机公司收购后技术整合而来的,如果我早期去做这个事情,而不是自己研究什么PDF标准,写什么PDF解析库什么的,估计就不是今天这个鸟样子了。

由于java虚拟机的这种与语言的相对独立性,所以,出现了这样一种情况,你可以开发一些新的语言,只要你能够把代码编译成java虚拟机支持的标准的class文件,就能跑在java虚拟机上面,这个思想太牛逼了,所以,现在已经诞生了许多类Java语言的语言,都运行在Java虚拟机上面,他们一般都提供了更好的语法特性,来提高开发效率,也挺受欢迎的。

第二,java是自带垃圾收集的,什么意思,就是代码里面申请内存之后,你就不用管什么时候去释放它了,由虚拟机来帮助你清理那些不不再使用的内存。着个对开发者来说大大降低了开发难度,也避免了很多内存泄漏导致的问题,这些问题在C或C++开发来说,都是调试起来费工费时的事情,所以大大提高了开发效率。虽然对开发者来说很爽,但对虚拟机的实现者来说,却非常的麻烦。就是你怎么才能知道这个内存永远不会被使用而去释放了呢?

不是引用计数哦,java虚拟机普遍采用了一种root节点登记的方式来分析不再使用的内存,如果从root节点开始,都无法建立同某个内存空间节点的指向关系,则证明,这个内存不再被代码所使用,就可以被释放。

所以,一次完整的垃圾回收(GC),其实是很费时费力,很浪费性能的,有时候会导致程序挂起很长的时间。所以,对于虚拟机性能的提升,很大程度上取决于不同虚拟机的垃圾回收机制的优劣。

优化gc效率,有很大的弹性,就是没有一种通用的方法能够提高所有情况下的效率。最基本的思想是分区,就是尽量减小全局gc的可能,在小范围类进行gc。所以,内存会被分为好几个区域,最简单的划分是新生代区和老年代区。为什么这么分呢?因为,在一般的代码执行过程中,新产生的对象,十有八九是用完就可以丢了,只有经过一段时间都没丢掉的内存,才会进入老年区,老年区因为相对稳定,进行gc的次数可以尽量少一些。

除此以外,其实还有很多参数,优化性能的方法很多时候要结合具体的应用场景去分析。另外,对于虚拟机的优化,还有很多特别的处理,不同的虚拟机厂商在今天依然在努力提高中,也有大量的项目在进行中。

第三, 个人觉得蛮重要的,但是书上只是讲解了一下原理的地方,就是java虚拟机里面非常牛逼的技术,就是能够在分析出热点代码,在实际运行的时候,会把这些编译成平台相关的二进制指令,而不再是由虚拟机解释,来提高虚拟机运行部分代码的速度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值