深入理解Java虚拟机
根据云计算网_泰州站长网 Www.0523Zz.Com报道 算机同时执行多个任务,不只是因为处理器的性能更加强大了,更重要是因为计算机的运算速度和它的存储以及通信子系统速度差距太大,大量的时间都花费在磁盘 I/O 、网络通信和数据库访问上。为了不让处理器因为等待其它资源而浪费处理器的资源与时间,我们就必须采用让计算机同时执行多任务的方式去充分利用处理器的性能;同时也是为了应对服务端高并发的需求。而 Java 内存模型的设计和线程的存在正是为了更好、更高效的实现多任务。 1.硬件与效率的一致性 计算机中绝大多数的任务都不可能只靠处理器计算就能完成,处理器至少要和内存交互,如读取数据、存储结果等等,这个 I/O 操作是很难消除的。由于计算器的存储设备和处理器的运算速度有几个量级的差距,所以计算机不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存来作为内存与处理器之间的缓冲:将运算需要用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存中,这样处理器就无需等待缓慢的内存读写了。 基于高速缓存的存储交互很好的解决了处理器与内存的速度矛盾,但是也为计算机系统带来更高的复杂度,因为它引入了一个新的问题:缓存一致性。在多处理器中,每个处理器都有自己的高速缓存,而它们又共享同一主内存。当多个处理器的运算任务都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致。为了解决一增加高速缓存外,为了使处理器内部的运算单元能尽量被充分利用,处理器可能会对输入的代码进行乱序执行优化,处理器会在计算之后将乱序执行的结果重组,保证该结果与顺序执行的结果一致,但不保证程序中各个语句计算的先后顺序与输入代码中的顺序一致,因此,如果存在一个计算任务依赖另一个计算任务的中间结果,那么其顺序性并不能靠代码的先后顺序来保证。与处理器的乱象执行优化类似,JIT 编译器中也有类似的指令重排优化。 2.Java 内存模型 Java 虚拟机规范中定义了 Java 内存模型,用来屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。像 C/C++ 这类语言直接使用了物理硬件和操作系统的内存模型,因此会由于不同平台上内存模型的差异,需要针对不同平台来编写代码。 主内存与工作内存 Java 内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中读取变量这样的底层细节。这里说的变量和 Java 代码中的变量有所区别,它包括了实例字段、静态字段和构成数组对象的元素,但不包括变量和方法参数,因为后者是线程私有的,不会被共享。为了获得较好的执行性能,Java 内存模型并没有限制执行引擎使用处理器的特定寄存器或缓存来和主内存进行交互,也没有限制 JIT 编译器进行代码执行顺序这类优化措施。
Java 内存模型规定了所有的变量都存储在主内存,每条线程都有自己单独的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存的副本拷贝, (编辑:沧州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |