作者:51Testing软件测试网 关注 2018-02-24 12:54:51
云计算
虚拟化
新闻 本篇主要针对Java虚拟机的晚期编译优化,Java内存模型与线程,线程安全与锁优化进行总结,其余部分总结请点击Java虚拟总结上篇 ,Java虚拟机总结篇。
本篇主要针对Java虚拟机的晚期编译优化,Java内存模型与线程,线程安全与锁优化进行总结,其余部分总结请点击Java虚拟总结上篇 ,Java虚拟机总结篇。
一.晚期运行期优化
即时编译器JIT
即时编译器JIT的作用就是热点代码转换为平台相关的机器码,并进行优化,它并不是一个虚拟机所必须的部分,只能说有它是锦上添花。
热点代码
热点代码分类
热点探测判定方法
编译过程(Client Complier)
***阶段
第二阶段
第三阶段
优化方法
公共子表达式优化
当一个表达式A的结果已经计算过了,且A中的所有变量都没有发生过变化,那么下一次要用到A时就不用计算了,而是直接取之前A的结果。
数组边界检查消除
方法内联
逃逸分析
逃逸的定义:一个在方法里定义的变量,作为参数传递给其他方法(方法逃逸),或者赋值给类变量(线程逃逸)。
优化方法:
栈上分配:不会逃逸的对象就不在堆上分配了,就在栈上分配,那么对象所占的空间就可以随栈帧的出栈而销毁,减少垃圾收集系统的压力。
同步消除:如果一个变量肯定不会逃逸出线程,那么关于这个变量的同步措施就可以去掉。
Java 虚拟机总结给面试的你
二.Java内存模型与线程
内存模型
说了这么多的内存模型,到底什么是内存模型呢?
特定的操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象。
它的作用是定义程序中各个共享的变量的访问规则,即如何将变量写入内存和从内存中取出变量。Java内存模型有主内存与工作内存之分,所有变量存在主内存中,线程则是拥有自己的工作内存,它是主内存的副本拷贝,线程只能读写工作内存。
8种原子操作
volatile变量的特殊规则
volatile的特性是保证此变量对所有线程的可见性,即当变量的值修改后,其他线程可以立即知道发生的变化。普通变量则是修改完值后,需要写回主内存,然后其他线程再从主内存读取该数据。volatile还可以通过内存屏障来禁止指令的重排序。综合来讲它的读操作和普通变量差不多,写操作慢一点。
long和double变量的特殊规则
8种操作一般都是原子性的,但是对于64位的数据,内存模型允许将没有被volatile修饰的64位数据的读写操作划分为两次32位的操作进行---->非原子协定但一般我们不需要将long和double声明为volatile。
先行发生原则
Java与线程
Java的Thread类大多API都是Native方法,是与平台相关的。
实现线程的三种方式
线程的调度
协同式调度
线程的执行时间由线程自己控制,执行完后再主动通知系统切换线程,可能会导致一个线程长时间地阻塞
抢占式调度
由系统分配时间,线程可以主动让出时间但是不能主动获得时间,通过设置优先级确定顺序
线程的状态
三.线程安全与锁优化
线程安全的程度,依次减弱
线程安全的实现方法
1、互斥同步
synchronized关键字会在代码块的前后分别形成monitorenter和monitorexit指令,这两个指令需要一个reference对象参数,该锁有一个计数器以实现同步,进入时将计数器+1,退出时-1,本线程可重入,其他线程需阻塞等待。synchronized的缺点是由于Java线程是映射到操作系统的,所以唤醒阻塞一个线程都需要系统帮忙,需要从用户态转到内核态,耗费很多处理器时间。
ReentrantLock对synchronized的优势:
2、非阻塞同步
为了解决线程阻塞和唤醒所带来的性能问题,先对共享数据进行操作,如果没有竞争就成功了,否则就补偿(不断重试直到成功)
3、无同步方案
锁优化
锁优化的方案有以下几种:
分享题目:Java虚拟机总结给面试的你
分享路径:http://www.shufengxianlan.com/qtweb/news10/370010.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联