Java高级
文章平均质量分 93
JVM
松仔log
初出茅庐的程序员
展开
-
Java高级——运行时数据区
局部变量表所需要的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。,只不过当时把分代设计扩展至方法区,或者说使用永久代来实现方法区而已,这样垃圾收集器能够像管理Java堆一样管理这部分内存。线程共享,用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。,控制着程序的运行、跳转、恢复,若执行的是Native方法则为空,,这部分内容将在类加载后存放在运行时常量池,除此之外,也。原创 2022-10-10 14:55:59 · 279 阅读 · 0 评论 -
Java高级——类加载及执行子系统的案例与实战
Class文件以何种格式存储、字节码指令如何执行等都是由JVM控制字节码生成与类加载器这两部分的功能,可由用户自定义,接下来将对一些实际应用进行介绍。原创 2023-09-09 16:04:07 · 247 阅读 · 0 评论 -
Java高级——Graal编译器介绍
Graal编译器由Java实现,支持JDK9推出,将Graal从HotSpot代码中独立出来(即可外部挂载)原创 2022-12-09 15:26:54 · 1732 阅读 · 0 评论 -
Java高级——后端编译与优化
生成一个包含编译代码过程信息的ideal.xml文件,用Ideal Graph Visualizer打开,如下左侧为编译过的方法列表和优化过程,右侧为理想图,节点表示程序的元素,边表示数据或控制流。即时编译器编译本地代码需要占用程序运行时间,且优化程度越高所需时间越长,想要编译出优化程度高的代码,还需让解释器收集性监控信息,同时制约了解释执行速度。若不使用libjava.base-coop.so,就只有HelloWord的构造函数和main()方法是提前编译,加上后使用的API都是提前编译好的。原创 2022-12-09 15:19:52 · 1375 阅读 · 0 评论 -
Java高级——前端编译与优化
前端编译器把java文件编译成class文件,如:JDK的Javac、Eclipse JDT中的增量式编译器(ECJ)前端编译器对代码的运行效率无任何优化措施性能优化集中到运行期的即时编译器中,这样可适用于非Javac生成的Class文件但有针对编码过程的优化,从而降低编码复杂度,如语法糖《Java虚拟机规范》未规定如何将java文件编译为Class文件,给予了较大的灵活性编译过程与具体编译器实现绑定,可能会导致某些代码在Javac中可以编译,而在ECJ则不可编译。原创 2022-11-14 19:18:44 · 679 阅读 · 2 评论 -
Java高级——解释执行
不同虚拟机执行引擎在执行字节码时,可分为下图中间分支为解析执行的过程,底部分支为程序代码到目标机器代码的生成过程Javac编译器完成了程序源码、词法分析、语法分析、抽象语法树、字节码指令流过程,独立于JVM,而解释器则在JVM内部。原创 2022-11-09 19:43:27 · 837 阅读 · 0 评论 -
Java高级——方法调用
方法调用阶段是确定被调用方法,不涉及方法内部的具体运行过程,分为解析和分派,所有方法调用的目标方法在Class文件里面都是一个常量池中的符号引用invokestatic:调用静态方法invokespecial:调用()方法、私有方法和父类方法invokevirtual:调用所有的虚方法invokeinterface:调用接口方法,会在运行时再确定一个实现该接口的对象invokedynamic:先动态解析出调用点限定符所引用的方法,然后再执行该方法。原创 2022-11-09 15:24:33 · 1374 阅读 · 0 评论 -
Java高级——模块化系统
在JDK 9以后,若启用了模块化封装,模块可声明对其他模块的显式依赖,JVM在启动时验证依赖关系,若缺失则启动失败,从而避免部分由于依赖而引发的运行时异常。JDK 9之前基于类路径(ClassPath)来查找依赖,若缺失,则等程序运行到该类型的加载、链接时才会报出运行时异常。所以也不支持多版本模块并存、运行时热替换、热部署模块的能力,仍须通过类加载器去实现(将OSGi和JPMS混合使用)为了保证使用传统类路径依赖的Java程序可以不经修改地直接运行在JDK 9及以后的版本,制定以下规则。原创 2022-11-02 15:53:23 · 1550 阅读 · 0 评论 -
Java高级——类加载器和双亲委派模型
为了避免破坏双亲委派模型,JDK1.2新增protect的findClass()方法,让用户尽可能重写findClass()而不是loadClass(),这样既不影响用户自定义加载类,又可保证新写的类加载器符合双亲委派模型。这是一种由父类加载器去请求子类加载器完成类加载的行为,打通了双亲委派模型的层次结构来逆向使用类加载器,典型应用有JNDI、JDBC等。,如对于Object,无论哪个类加载器加载,最终都委派给启动类加载器,从而保证了唯一性。除了启动类加载器外,其余的类加载器都有自己的父类加载器,原创 2022-11-02 09:13:30 · 674 阅读 · 0 评论 -
java高级——类加载机制
没有触发SuperClass初始化,但newarray指令触发了[SuperClass初始化,它是由JVM生成、继承于Object的子类,代表一个元素类型为SuperClass的一维数组,其属性(如length)和方法(如clone)都在这个类中实现。对于静态字段,只有直接定义这个字段的类才会被初始化,由子类来引用父类中的静态字段,只会触发父类的初始化而不会触发子类的初始化。解析类方法需先解析其所属类或接口(设为C)的符号引用,查找name_index和descriptor_index都匹配的方法。原创 2022-11-01 15:36:44 · 355 阅读 · 0 评论 -
Java高级——字节码指令
方法级的同步无须通过字节码指令来控制,当方法调用时检查ACC_SYNCHRONIZED,如果设置了,线程就要先持有管程才能执行方法,方法完成时释放管程。long、float、double的条件分支操作,会先执行比较运算指令得到int值,再执行int类型的条件分支指令来完成分支跳转。int或long窄化转换为其他整型时直接高位截断,可能导致符号位改变。处理异常(catch语句)不由字节码指令实现,而是采用异常表。运行时异常会在其他指令检测到异常时自动抛出。,可分为对整数和对浮点数进行运算的指令。原创 2022-10-20 14:55:44 · 1099 阅读 · 0 评论 -
Java高级——内存分配机制
对象都是在堆上分配,但实际上也有可能经过即时编译后被拆散为标量类型并间接地在栈上分配分代设计下,新生对象通常会分配在新生代中,少数情况下(例如对象大小超过一定阈值)也可能会直接分配在老年代《Java虚拟机规范》并未规定新对象的创建和存储细节,取决于垃圾收集器及参数的设定以下如无特别说明,均使用HotSpot虚拟机的Serial+Serial Old,JDK8环境。原创 2022-10-19 17:15:09 · 1479 阅读 · 0 评论 -
Java高级——Class文件及解析
Class文件十六进制解析原创 2022-10-19 17:13:23 · 1594 阅读 · 0 评论 -
Java高级——垃圾收集器及日志
工作(指在GC时必须暂停其他线程,直到它收集结束),其简单高效,内存消耗小,适用于内存资源受限的环境,是HotSpot在Client模式下的默认收集器。因为ZGC目前不分代,且每次收集扫描所以Region,当收集速度跟不上分配速度时,也会导致错误,解决办法是尽可能增大堆容量(或采用分代)版本,除了同时使用多线程进行gc外,其他都一样,在JDK7之前首选的新生代收集器(原因之一是其可以和CMS配合)Epsilon不回收垃圾,运行负载极小,适用于只需要短时间运行,在堆耗尽之前退出的应用。原创 2022-10-14 10:47:02 · 1271 阅读 · 0 评论 -
Java高级——垃圾收集及其算法
安全点保证程序执行时的垃圾收集,但当线程Sleep或Blocked时,线程无法响应虚拟机的中断请求,不能跑到安全点中断挂起,虚拟机也不太可能持续等待该线程被重新唤醒。对于第三点,存在互相引用的对象是倾向于同时生存或同时消亡的,如新生代被老年代所引用,因为老年代难以消亡,而被引用的新生代会逐渐晋升为老年代。标记出所有需要回收的对象,回收被标记的对象(或标志存活的对象,回收未被标记的对象),标记过程就是判断。,如:一个接口的多个实现类需要的内存可能不一样,只有在运行期间才能确定内存的分配和回收。原创 2022-10-12 16:14:56 · 777 阅读 · 0 评论 -
Java高级——OutOfMemoryError和StackOverflowError
上面情况都是在单线程中运行的,在多线程情况下,可通过不断创建线程抛出OutOfMemoryError(但和栈空间没什么关系),原因是操作系统的剩余内存不足以分配给新的线程。栈帧太大,新的栈帧无法继续分配时,Hotspot抛出StackOverflowError,若是允许动态扩展栈的虚拟机则抛出OutOfMemoryError。,故inern()返回的是永久代中的字符串引用,而StringBuilder返回的是java堆中字符串引用,两者不等。若方法区内存已用完,则抛出OutOfMemoryError,原创 2022-10-10 14:54:49 · 1722 阅读 · 0 评论 -
Java高级——对象
存储顺序与JVM分配策略参数(–XX:FieldsAllocationStyle)及字段在Java中定义的顺序有关默认分配顺序为longs/doubles、ints、shorts/chars、byte/boolean、Ordinary Object Pointers默认父类变量出现在子类前,当+XX:CompactFields设为true,则允许子类中较窄的变量插入父类变量的空隙中。原创 2022-10-10 14:49:56 · 211 阅读 · 0 评论 -
Java高级——编译JDK
JDK12编译原创 2022-09-28 16:33:54 · 1292 阅读 · 0 评论