jvm的个人理解【1】

今儿,精神好,写一篇博客压压惊。这边博客重在原理很少有实际堆栈分析,java虚拟机的内存管理以后再讲吧。

首先java虚拟机,从他的名字上,我们就可以很清楚的区分出他很像是一台虚拟出来的计算机。那么它必然与计算机的运行有着千丝万缕的联系,它的工作模式也会在无形的之中借鉴计算机的工作模式。如果留心的人会发现java文件产生的class文件跟汇编语言的设计意义何其的相识。只不过汇编语言的到的是真正的计算机的指令,能直接对机器进行操作,如cs:ip能够直接定位到存储器上的指令。而java的class文件是得到的一些java虚拟机需要执行java虚拟机的指令,这些指令是无法调用真是的计算机硬件等的。例如他的程序计数器器跟cs:ip的发挥着同样的作用,但是他找出来的不是机器指令,而是java虚拟机的指令。


       它会通过虚拟机根据不同的平台转化成不同的机器指令,那么这也是java在性能上与c语言相比存在较大差距的一个很重要的原因。当然这也是java跨平台优势的得来。或许语言的选择将决定了它的方向吧。在跨平台兴起的现代的软件界,java的优势也发挥得淋淋尽致,也很快的奠定了它在语言界的地位。而与之平行的c语言也因为其快速操作的优势,跟java一起互惠互利,使得软件的发展更为完美。他们存在着竞争,但是更存在着互补。这篇文章主要是介绍java虚拟机的,就不对这两种语言的互补做太多的介绍(吐舌头其实作者的水平根本就不好意思介绍,那是大师或牛人的事儿)。当然java虚拟机的制作者们可是业界的精英,他们也在努力的改变着java语言多次转化的劣势,并有很多不好的方法,如缓存已将转化成二进制机器指令的的类或方法的二进制机器指令,那么下次调用的时候,便可以直接用机器指令进行调用,这对java的性能提升是显而易见的。我没有做过相应的测试看看它的性能具体差距有多大,以后有时间再看看吧。


      java虚拟的内存管理也是java虚拟机巨大的特点和优势之一。它选择了,自动的垃圾回收机制,这样使得程序猿一般情况下在也不用讲自己的经历放在一些不容易控制的垃圾回收上。这样将很大的降低程序猿的编程难度。但是也可能存在一定的问题,一旦遇到了一些棘手的内存溢出问题,你就得忙活忙活了闭嘴。而且自己就不能掌握内存的分配。一句比较经典的话,垃圾回收机制就是一度墙,墙里面的想出去,墙外面的想进来。而java虚拟机的内出处理机制,自动垃圾回收的内容很多,以后在写文章进行仔细的说明吧。

     java虚拟机的内存处理还是比较复杂的以后再慢慢讲吧,现在对它进行简单的介绍。java的内存区域两个最重要的部分,一个就是栈,另外一个就是堆。它们代表了对数据的不同处理吧。堆更像是一个内存中保存数据的地方,而栈更多的用于运行时的需要来保存线程的上下文,如帧栈就是运行方法的基本区域。由于栈的深度有限,栈往往在运行过程中是保存在对数据或对象的引用,当然基本数据类型除外。他们是传值的方式进行。这样必然将对栈的空间进行了比较大的压缩。其实多线程的问题,也就是在栈的执行过程中,对堆的数据,进行的版本控制的问题,volatile所使用范围有限的原因,因为它的机制(在使用过程中直接使用,而不用复制)使得他具有可见性,满足了多线程控制的一个原因,但是却不能满足多线程控制的有序性。所以一旦涉及到值的变化它的使用就非常有限。其实将数据复制到一个java虚拟机的一个类似于寄存器的区域,再进行内存处理,其实也是借鉴与计算机对数据的处理过程(个人意见,不喜请指正)。

     怎么感觉要说的越来越多,时间有限,马上工作,下次再说。

   

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值