Java虚拟机
文章平均质量分 91
我的Java虚拟机相关书籍读书笔记。
lippon
Think Different.
展开
-
Java虚拟机问题总结
JVM参数主要有几种分类标准参数标准参数,顾名思义,标准参数中包括功能以及输出的结果都是很稳定的,基本上不会随着JVM版本的变化而变化。标准参数以-开头,如:java -version、java -jar等,通过java -help可以查询所有的标准参数。非标准参数非标准参数以-X开头,是标准参数的扩展。对应前⾯讲的标准化参数,这是非标准化参数。表示在将来的JVM版本中可能会发生改变,但是这类以-X开始的参数变化的⽐较小。不稳定参数这是我们日常开发中接触到最多的参数类型。这也是⾮标准化参数,原创 2021-01-01 10:29:27 · 167 阅读 · 1 评论 -
深入理解Java虚拟机(十)——线程安全与锁优化
什么是线程安全当多个线程同时访问一个对象的时候,不需要考虑什么额外的操作就能获取正确的值,就是线程原创 2020-11-16 10:33:03 · 84 阅读 · 0 评论 -
深入理解Java虚拟机(九)——后端编译与优化
即时编译器Java程序最初都是通过解释器进行执行,当发现某个方法或者代码块被运行得非常频繁,这些代码就被认为是热点代码,为了提高这些代码得运行效率,虚拟机会把热点代码编译成本地机器码,并进行优化,运行时完成这个任务的后端编译器被称为即时编译器。解释器与编译器主流Java虚拟机内部同时包含解释器与编译器。解释器优点:当程序需要迅速启动和运行的时候,解释器可以省去编译的时间,立即运行代码。编译器优点:当程序启动后,编译器将执行频繁的代码编译成本地代码,减少解释器的中间损耗,提高执行效率。原创 2020-11-16 09:37:19 · 142 阅读 · 0 评论 -
深入理解Java虚拟机(八)——类加载机制
’## 是什么是类加载机制Java虚拟机将class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程就是类加载机制。类的生命周期一个类从加载到内存开始,到卸载出内存为止,一共经历七个阶段:加载——>验证——>准备——>解析——>初始化——>使用——>卸载其中,类加载包括其中五个阶段:加载——>验证——>准备——>解析——>初始化其中三个过程被称为连接:验证——>准备——&原创 2020-11-07 11:10:53 · 184 阅读 · 0 评论 -
深入理解Java虚拟机(七)——类文件结构
Java的无关性由于计算机领域中有很多操作系统和硬件平台同时在竞争,所以,很多编程语言的程序设计会与其运行的平台和操作系统产生耦合,这样就大大增加了程序员的工作,为了适应不同的平台,需要修改很多代码。这样,具有无关性特征的Java语言就开始受欢迎了。平台的无关性:由于有可以运行在不同硬件平台和操作系统上的Java虚拟机,而这些虚拟机都可以载入执行与平台无关的字节码,从而实现了一次编译,到处运行。所有虚拟机都支持一种程序存储格式——字节码,是构成平台无关性的基石。语言的无关性:不同平台上的Java虚拟机原创 2020-11-06 10:46:32 · 208 阅读 · 0 评论 -
深入理解Java虚拟机(六)——JVM调优分析与实战
大内存硬件上的程序部署策略单个虚拟机管理大内存出现问题如果JVM中的堆内存太小,就会频繁地出发GC,而每次GC会将用户线程暂停,所以,频繁地GC会导致长时间的停顿。如果扩大计算的内存的大小,就能降低GC触发的频率。32位系统最大支持4g内存,而64位操作系统可以最大支持128g内存,所以,我们可以通过换用64位系统和提高内存的方式降低虚拟机的用户线程停顿,但是还是有问题。虽然Full GC总体的频率降低了,但是每次Full GC的时间却增长了,因为积攒的需要回收的空间变大了嘛。这样会导致长时间的停原创 2020-11-05 10:35:11 · 133 阅读 · 0 评论 -
深入理解Java虚拟机(五)——JDK故障处理工具
进程状况工具:jpsjps(JVM Process Status Tool)作用用于虚拟机中正在运行的所有进程并显示虚拟机执行的主类名称以及这些进程的本地虚拟机唯一ID。可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,参数hostid为RMI注册表中注册的主机名特点使用频率最高的命令工具,需要通过它来查询进程的ID,从而进行下一步监控。统计信息监视工具:jstatjstat(JVM Statistics Monitoring Tool)作用用于监视虚拟机各种运行状态信原创 2020-11-05 09:14:47 · 129 阅读 · 0 评论 -
深入理解Java虚拟机(四)——HotSpot垃圾收集器详解
具体实现细节知识点根节点枚举所谓根节点枚举就是在垃圾收集过程中,利用可达性算法标记有效对象前,寻找GC Roots的集合。固定可作为GC Roots的节点主要在全局性的引用(如常量)与执行上下文(例如栈帧中的本地变量表)中。存在问题:在根节点枚举的时候必须暂停用户线程,存在Stop the world的困扰。否则分析结果的准确性无法保证。主流的Java虚拟机采用的都是准确式垃圾收集,所以在用户线程停顿之后需要一个不漏的检查完所有的执行上下文和全局变量中的引用位置。在HotSpot的解决方案中,利用原创 2020-11-04 09:12:50 · 417 阅读 · 0 评论 -
深入理解Java虚拟机(三)——垃圾回收策略
所谓垃圾收集器的作用就是回收内存空间中不需要了的内容,需要解决的问题是回收哪些数据,什么时候回收,怎么回收。Java虚拟机的内存分为五个部分:程序计数器、虚拟机栈、本地方法栈、堆和方法区。其中程序计数器、虚拟机栈和本地方法栈是线程私有的,所以对于何时回收这三部分内存只需要根据线程的生存周期就可以了。而堆和方法区是线程共享的,其诞生和销毁伴随的虚拟机的启动和停止,所以需要特定的算法来判断内存是否可以被回收。堆内存的回收判断那些对象需要回收垃圾回收器在回收之前,需要判断那些对象已经不会被使用,那些是原创 2020-11-03 15:16:54 · 223 阅读 · 1 评论 -
深入理解Java虚拟机(二)——HotSpot对象创建、内存、访问
对象的创建虚拟机遇到一条字节码new指令时,开始对象创建过程。首先去检查这个指令的参数是否能在常量池定位到一个类的符号引用;检查这个符号引用代表的类是否已被加载、解析和初始化,如果没有就必须执行相应的类加载过程;根据方法去中该类的信息确定对象的所需空间大小;虚拟机为新生对象分配内存;将对象实例的内存(不包括对象头)进行初始化为零值;配置对象头的信息;调用对象的构造函数进行初始化。这样,一个真正可用的对象被完全构造出来了。分配内存方法虚拟机为新生对象分配内存有两种方法:碰撞指针:原创 2020-11-03 09:28:18 · 171 阅读 · 0 评论 -
深入理解Java虚拟机(一)——JVM内存模型
文章目录程序计数器定义作用特点Java虚拟机栈定义特点本地方法栈定义Java堆定义特点方法区定义特点运行常量池直接内存总结Java虚拟机的内存空间分为五个部分:方法区堆虚拟机栈本地方法栈程序计数器程序计数器定义程序计数器是一个块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指令器。程序计数器记录的是当前线程正在执行的那一条字节指令的地址。如果当前线程正在执行的是一个本地方法,那么程序计数器为空。作用程序计数器有两个作用:字节码解释器可以通过改变程序计数器的值,原创 2020-11-02 10:43:24 · 608 阅读 · 0 评论