![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
深入理解java虚拟机
qiny_123
这个作者很懒,什么都没留下…
展开
-
Java与线程
java与线程java提供了在不同硬件和操作系统环境下对线程操作的统一处理,每个已经通过start()方法且还没结束的java.lang.Thread类的实例就代表一个线程。线程实现方式使用内核线程实现(1:1实现)内核线程(KLT,即操作系统原生线程)定义:直接由操作系统内核支持的线程,操作系统内核负责内核线程的切换,内核通过操控调度器对线程进行调度,并负责将** 线程的任务映射**到各个处理器上。内核线程提供一种高级接口–轻量级进程(LWP–给应用程序使用,每个轻量级进程都由一个内核线原创 2020-10-26 20:19:04 · 87 阅读 · 0 评论 -
java内存模型
java内存模型定义java内存模型可以屏蔽各种硬件和操作系统的内存访问差异,实现让java程序在各个平台能够达成一致的内存访问效果。java内存模型的目的是:定义程序中各个变量的访问规则(即把变量值存储到内存以及从内存中取出这样的底层细节)。注这里的变量为实例变量、静态变量还有构成数组对象的元素。不包括方法中定义的变量,以为方法最终转化为栈帧,放到虚拟机栈中,是线程私有的,不存在共享。主内存和工作内存主内存作用(可以视为硬件中的主存,主内存是虚拟机内存的一部分):所有变量都存储在主内存中,不原创 2020-10-25 10:24:58 · 62 阅读 · 0 评论 -
虚拟机字节码执行引擎
原创 2020-10-16 16:10:49 · 106 阅读 · 1 评论 -
虚拟机类加载机制
类加载机制定义: 虚拟机把描述类的数据从Class文件加载到内存,并堆数据进行校验、转换解析和初始化,最终形成被虚拟机直接使用的java类型。类型的加载、连接和初始化过程都是在程序运行期间完成,java动态扩展的特性就是依赖运行期间动态加载和动态连接这个特点实现的。如:编写一个面向接口的应用程序,可以等到运行时再指定其实际的实现类。类加载时机类加载过程(1)加载(2)验证(3)准备(4)解析(5)初始化类加载器...原创 2020-09-28 14:37:22 · 111 阅读 · 0 评论 -
JVM OOP-Klass二分模型
1 概述HotSpot是基于c++实现,而c++是一门面向对象的语言,本身具备面向对象基本特征,所以Java中的对象表示,最简单的做法是为每个Java类生成一个c++类与之对应。但HotSpot JVM并没有这么做,而是设计了一个OOP-Klass Model。这里的 OOP 指的是 Ordinary Object Pointer (普通对象指针),它用来表示对象的实例信息,看起来像个指针实际上是藏在指针里的对象。而 Klass 则包含元数据和方法信息,用来描述Java类。之所以采用这个模型是因为Ho原创 2020-09-26 20:47:27 · 639 阅读 · 0 评论 -
voliate关键字原理
被volatile修饰的变量在编译成字节码文件时会多个lock指令,该指令在执行过程中会生成相应的内存屏障,以此来解决可见性跟重排序的问题。voliate关键字作用静止重排序保证变量赋值操作的顺序与程序代码中的执行顺序一致。线程可见性原理使用场景...原创 2020-09-25 11:17:31 · 17005 阅读 · 2 评论 -
类文件结构描述
java语言平台无关性java语言为什么平台无关:虚拟机运行在不同的平台上,但是这些虚拟机都可以加载和执行字节码文件,这样字节码文件就可以在不同的平台上执行。(即:虚拟机是与平台相关的,但是字节码文件是与与平台无关)。Class类文件结构(构成)class文件特点:(1)一组以8个字节为基础单位的二进制流,各个数据项目紧凑排列在文件之中,没有任何分隔符。(2)文件中只有两种数据类型:无符号数和表无符号数:属于基本的数据类型,u1,u2,u4,u8分别表示1、2、4、8字节的无符号数。无符号数原创 2020-09-25 11:18:29 · 289 阅读 · 0 评论 -
虚拟机性能监控、故障处理工具
jps:虚拟机进程状况工具jps -l: 显示虚拟机运行的进程ID 和 执行的主类(Mian()函数所在的类)jps -v:显示虚拟机启动时被设置的参数jps -q:值显示进程ID,不显示主类信息jstat:虚拟机统计信息监视工具jstat命令格式:jstat [ option vmid [ interval[s|ms] [count]]]其中vmid是虚拟机进程id 。interval和count为查询间隔和次数,如果省略这个参数表示查询一次。比如:jstat -原创 2020-09-24 09:20:07 · 92 阅读 · 0 评论 -
java虚拟机--选择合适的收集器、内存分配与回收策略实战
垃圾收集器的作用:垃圾收集器除了垃圾收集之外,还负责堆的管理与布局、对象分配、与解释器协作、与编译器协作、与监控子系统协作等Epsilon垃圾收集器特点:不进行垃圾收集,只进行对象的分配。应用场景:如果应用只运行几分钟或者几秒钟,在堆耗尽之前就会退出,那么只需要垃圾收集器能够为对象分配内存即可,不用涉及垃圾收集,这是不进行垃圾回收的Epsilon垃圾收集器很有用。垃圾收集器的权衡指标应用程序关注点:应用进行数据分析、计算等,需要高吞吐量?应用需要与用交互,需要低延迟?是客户端应用或者嵌入.原创 2020-09-18 15:38:19 · 119 阅读 · 0 评论 -
java虚拟机--低延迟垃圾收集器(ZGC收集器)
ZGC(Z Garbage Collector)是一款在JDK11中新加入的具有实验性质的低延迟垃圾收集器ZGC特征ZGC基于Region的内存布局,(暂时)不设分代,使用读屏障、染色指针和内存多重映射等技术来实现可并发的标记-整理算法,以低延迟为首要目标的一款垃圾收集器读屏障理解:这与其他GC使用的写屏障形成对比,例如G1。读屏障的工作是检查引用的状态,并在将引用(或者甚至是不同的引用)返回给应用程序之前执行一些工作。 在ZGC中,它通过测试加载的引用来执行此任务,以查看是否设置了某些位。 如果.原创 2020-09-17 19:30:34 · 183 阅读 · 0 评论 -
java虚拟机--低延迟垃圾收集器(Shenandoah收集器)
Shenandoah收集器是由RedHat公司开发的项目,Oracle拒绝在OracleJDK12中支持该收集器,Shenandoah只有在OpenJDK中才会包含,而OracleJDK中不包含的。该收集器的目标:无论堆的大小如何,都可以把垃圾收集器的停顿时间限制在10ms以内。Shenandoah工作过程(1)初始标记标记GC Roots直接引用的对象。需要stop the world,时间长度取决于GC Roots的多少。(2)并发标记从GC Roots直接引用的对象出发,进行可达性.原创 2020-09-16 15:12:45 · 378 阅读 · 0 评论 -
java虚拟机--经典垃圾收集器
图中展示了其中作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用,图中收集器所处的区域,则表示它是属于新生代收集器还是老年代收集器Serial收集器(新生代)该收集器是一个单线程工作的收集器,不仅仅使用一条垃圾收集线程完成垃圾收集工作,而且该垃圾收集器进行垃圾收集工作(标记-复制)时,必须暂停其他所有工作的线程(Stop The World),直到垃圾收集结束。Serial/Serial Old垃圾收集器运行示意图无论是标记-复制还是标记-整理垃圾算法,标记过程都是一样的.原创 2020-09-13 20:34:01 · 180 阅读 · 0 评论 -
java虚拟机--对象死亡判定、垃圾收集算法、HotSpot的算法细节实现
对象已死?判断对象是否已死(可以被回收)的方法引用计数法实现方式:为每个对象添加一个引用计数器,当一个地方引用了该对象,计数器加1,当引用失效,计数器减法1,,计数器减为0是,该对象就可以被清理。存在的问题:难以解决对象的循环引用。故java虚拟机中没有使用引用计数器来管理内存。可达性分析法java虚拟机通过可达性分析判定对象是否存活。实现过程:从GC Roots开始,根据引用关系搜索(搜索所走的路径成为引用链),如果GC Roots到某个对象不可达,那么说明该对象以不被使用。原创 2020-09-08 17:20:50 · 182 阅读 · 0 评论 -
java内存管理--OutOfMemoryError(内存溢出异常)
java堆溢出可以通过-Xms 20m -Xmx 20m来设置堆的最小与最大内存。通过参数-XX:+HeapDumpOnOutOfMemoryError参数,当堆中发生内存溢出异常时,生成内存快照。堆内存溢出是最常见的异常。解决该异常首先要对发生异常时候的内存快照进行分析,第一步是确认导致内存溢出的对象是不是有必要的(即分清楚是内存泄露(Memory Leak,即无用的对象占用内存不释放内存)还是内存溢出(Memory Overflow))。如果是内存泄露,通过工具查看泄露对象到GC roots的引原创 2020-09-05 19:10:25 · 237 阅读 · 0 评论 -
Java内存管理--对象
对象创建过程判定类是否被加载、解析初始化。虚拟机遇到new指令,首先检查这个指令的参数是否能在运行时常量池中定位到符号应用,并且检查该符号引用代表的类是否被加载、解析、初始化过。如果没有则进行类加载。为对象分配内存。在java堆中划分出一块确定大小的内存,该内存的大小在类加载阶段就已经确定。分配内存的方式指针碰撞当堆中使用的Serial、ParNew等带压缩整理的垃圾收集器时,java堆中的内存是规整的(使用过的内存与空闲内存完全分开,中间放一个指针),当分配内存时,仅仅是将指针向空闲内存原创 2020-09-05 15:48:52 · 164 阅读 · 0 评论 -
Java内存管理--运行时数据区
运行时数据区java虚拟机在执行java程序的时候,把管理的内存划分为若干个不同的数据区域,不同区域的用途、创建时间、销毁时间不同java虚拟机把管理的内存(运行时数据区)划分为一下几个部分程序计数器java虚拟机栈本地方法栈方法区堆程序计数器程序计数器是是一块较小的内存,可以看作当前线程所执行的字节码行号指示器。如果线程执行的是一个java方法,那么计数器记录的是该线程正在执行的字节码指令地址。如果正在执行的是一个本地方法,该计数器的值为空。为了线程切换后能恢复到正确的执行原创 2020-09-05 10:28:03 · 136 阅读 · 0 评论