
JVM
文章平均质量分 94
Java都不学
这个作者很懒,什么都没留下…
展开
-
JVM线程安全
当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为(单次调用)都可以获得正确的结果,那就称这个对象是线程安全的。原创 2022-11-09 22:26:08 · 694 阅读 · 0 评论 -
Java&线程&协程
线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度。原创 2022-11-08 22:58:20 · 1917 阅读 · 0 评论 -
Java内存模型
并发处理的广泛应用是Amdahl定律代替摩尔定律[1]成为计算机性能发展源动力的根本原因,也是 人类压榨计算机运算能力的最有力武器。原创 2022-11-08 18:09:59 · 678 阅读 · 0 评论 -
JVM后端编译与优化——编译器优化技术
·最重要的优化技术之一:方法内联。·最前沿的优化技术之一:逃逸分析。·语言无关的经典优化技术之一:公共子表达式消除。·语言相关的经典优化技术之一:数组边界检查消除。原创 2022-11-07 18:33:06 · 501 阅读 · 0 评论 -
后端编译与优化——提前编译
提前编译产品和对其的研究有着两条明显的分支:一条分支是做与传统C、C++编译器类似 的,在程序运行之前把程序代码编译成机器码的静态翻译工作;另外一条分支是把原本即时编译器在运行时要做的编译工作提前做好并保存下来,下次运行到这些代码(譬如公共库代码在被同一台机器 其他Java进程使用)时直接把它加载进来使用。原创 2022-11-07 16:44:27 · 419 阅读 · 0 评论 -
后端编译与优化(JIT,即时编译器)
Java程序最初都是通过解释器 (Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁,就会把这些代码认定为“热点代码”(Hot Spot Code),为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成本地机器码,并以各种手段尽可能地进行代码优化,运行时完成这个任务的后端编译器被称为即时编译器。原创 2022-11-05 21:43:28 · 1025 阅读 · 0 评论 -
前端编译与优化(Javac,语法糖)
编译期可能是指一个前端编译器(叫“编译器的前端”更准确一些)把*.java文件转变成*.class文件的过程;也可能是 指Java虚拟机的即时编译器(常称JIT编译器,Just In Time Compiler)运行期把字节码转变成本地机器码的过程;还可能是指使用静态的提前编译器(常称AOT编译器,Ahead Of Time Compiler)直接把程序编译成与目标机器指令集相关的二进制代码的过程。原创 2022-11-04 22:30:46 · 697 阅读 · 0 评论 -
类加载及执行子系统的案例
在Class文件格式与执行引擎这部分里,用户的程序能直接参与的内容并不太多,Class文件以何种 格式存储,类型何时加载、如何连接,以及虚拟机如何执行字节码指令等都是由虚拟机直接控制的行 为,用户程序无法对其进行改变。能通过程序进行操作的,主要是字节码生成与类加载器这两部分的功能。原创 2022-11-03 23:29:29 · 308 阅读 · 0 评论 -
基于栈的字节码解释执行引擎
对于一门具体语言的实现来说, 词法、语法分析以至后面的优化器和目标代码生成器都可以选择独立于执行引擎,形成一个完整意义的编译器去实现,这类代表是C/C++语言。也可以选择。原创 2022-11-03 19:06:05 · 384 阅读 · 0 评论 -
虚拟机字节码执行引擎——动态类型语言支持
随着JDK 7的发布的字节码首位新成员——invokedynamic指令。这条新增加的指 令是JDK 7的项目目标:实现动态类型语言(Dynamically Typed Language)支持而进行的改进之一, 也是为JDK 8里可以顺利实现Lambda表达式而做的技术储备。原创 2022-11-03 18:29:36 · 499 阅读 · 1 评论 -
虚拟机字节码执行引擎——方法调用
方法调用并不等同于方法中的代码被执行,暂时还未涉及方法内部的具体运行过程。Class文件的编译过程中不包含传统程序语言编译的连接步骤,,而不是方法在实际运行时内存布局中的入口地址(也就是之前说的直接引用)。这个特性给Java带来了更强大的动态扩展能力,但也使得Java方法调用过程变得相对复杂,某些调用需要在类加载期间,甚至到运行期间才能确定目标方法的直接引用。原创 2022-10-26 19:18:04 · 342 阅读 · 0 评论 -
虚拟机字节码执行引擎——运行时栈帧结构
虚拟机”是一个相对于“物理机”的概念,这两种机 器都有代码执行能力,其区别是,而,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。在不同的虚拟机实现中,执行引擎在执行字节码的 时候,通常会有两种选择,也可能两者兼备,还可能会有同时包含几个不同级别的即时编译器一起工作的执行引擎。但 从外观上来看,原创 2022-10-25 22:47:18 · 631 阅读 · 0 评论 -
JAVA_类与类加载器
类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节 流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动 作的代码被称为“类加载器”(Class Loader)。原创 2022-10-24 16:04:20 · 102 阅读 · 0 评论 -
Java类加载的过程
通过一个类的全限定名来获取定义此类的二进制字节流”这条规则,它并没有指明二 进制字节流必须得从某个Class文件中获取,确切地说是根本没有指明要从哪里获取、如何获取。原创 2022-10-21 23:02:25 · 628 阅读 · 0 评论 -
一个线程OOM后,其它线程还能运行吗?
当JVM资源利用出现问题时抛出,更具体地说,这个错误是由于JVM花费太长时间执行GC且只能回收很少的堆内存时抛出的。根据Oracle官方文档,默认情况下,如果Java进程花费98%以上的时间执行GC,并且每次只有不到2%的堆被恢复,则JVM抛出此错误。换句话说,这意味着我们的应用程序几乎耗尽了所有可用内存,垃圾收集器花了太长时间试图清理它,并多次失败。在这种情况下,用户会体验到应用程序响应非常缓慢,通常只需要几毫秒就能完成的某些操作,此时则需要更长的时间来完成,这是因为所有的CPU。原创 2022-10-21 16:50:04 · 1854 阅读 · 0 评论 -
JAVA字节码指令简介
Java虚拟机的指令由(称为,Opcode)(称为,Operand)构成。由于Java虚拟机采用而不是面向寄存器的架构,所以字节码指令集限制了Java虚拟机操作码的长度为一个字节(即0~255),这意味着;又由于,这就意味着虚拟机在处理那些超过一个字节的数据时,不得不在运行时从字节中重建出具体数据的结构譬如要将一个16位长度的无符号整数使用两个无符号字节存储起来(假设将它们命名为byte1和byte2),那它们的值应该是这样的:(byte1原创 2022-10-19 21:15:39 · 863 阅读 · 0 评论 -
Class类文件结构(JAVA8)
Java技术能够一直保持着非常良好的向后兼容性,Class文件结构的稳定功不可没,任何一门程序 语言能够获得商业上的成功,都不可能去做升级版本后,旧版本编译的产品就不再能够运行这种事 情。原创 2022-10-18 22:59:24 · 759 阅读 · 0 评论 -
虚拟机性能监控、故障处理工具
基础故障处理工具原创 2022-10-16 18:19:18 · 1084 阅读 · 0 评论 -
JAVA选择合适的垃圾收集器+内存分配实战
目录低延迟垃圾收集器Shenandoah收集器ZGC收集器选择合适的垃圾收集器Epsilon收集器收集器的权衡虚拟机及垃圾收集器日志垃圾收集器参数总结 实战:内存分配与回收策略Shenandoah也是使用基于Region的堆内存布局,同样有着用于存放大对象的Humongous Region,默认的回收策略也同样是优先处理回收价值最大的Region……但在管理堆内存方面,它与G1至少有三个明显的不同之处,最重要的当然是支持并发的整理算法,G1的回收阶段是可以多线程并行的,但却不能与用户线程并发。其次,Shen原创 2022-10-15 21:02:10 · 739 阅读 · 0 评论 -
JAVA经典垃圾收集器与内存分配策略
如果对象要在finalize()中成功拯救自己——只要重新与引用链上的任何一个对象建立关联即可,譬如把自己 (this关键字)赋值给某个类变量或者对象的成员变量,那在第二次标记时它将被移出“即将回收”的集合;如果对象这时候还没有逃脱,那基本上它就真的要被回收了。它的运行代价高昂,不确定性大,无法保证各个对象的调用顺序,如今已被官方明确声明为不推荐使用的语法。原创 2022-10-13 23:42:43 · 904 阅读 · 0 评论 -
Java内存区域与内存溢出异常
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》原创 2022-10-12 23:22:53 · 779 阅读 · 0 评论