
Java虚拟机
文章平均质量分 90
在云端123
这个作者很懒,什么都没留下…
展开
-
CMS、G1、ZGC的堆内存实现区别
每次被问到Java的堆内存是如何细分?很多人回答这个问题的时候,都是上来就直接说新生代和老年代,以为所有算法的内存实现都一样。其实CMS、G1、ZGC的堆内存实现是不同的。我们可以从这三种垃圾回收器的堆内存实现更好地回答这个问题。CMSCMS堆内存和以往的垃圾回收器一样,分为新生代和老年代,新生代和老年代是物理隔离的。这些space必须是地址连续的空间。G1G1打破了以往将收集范围...原创 2020-03-25 03:31:50 · 2742 阅读 · 2 评论 -
关于安全点和安全区域
安全点安全点,即程序执行时并非在所有地方都能停顿下来开始GC,只有在到达安全点时才能暂停。Safepoint的选定既不能太少以至于让GC等待时间太长,也不能过于频繁以致于过分增大运行时的负荷。安全点的初始目的并不是让其他线程停下,而是找到一个稳定的执行状态。在这个执行状态下,Java虚拟机的堆栈不会发生变化。这么一来,垃圾回收器便能够“安全”地执行可达性分析。只要不离开这个安全点,Java虚拟...原创 2020-01-05 00:10:32 · 2076 阅读 · 1 评论 -
关于JMH运行ERROR: transport error 202: connect failed: Connection refused ERROR解决
ERROR: transport error 202: connect failed: Connection refusedERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports ...原创 2018-12-08 00:45:22 · 11344 阅读 · 5 评论 -
关于JVM的卡表和写屏障
我们都知道JVM为了更有效率地清除垃圾,把堆对象分为年轻代和老年代,这就导致年轻代和老年代的对象存在互相引用的现象。年轻代指向老年代的引用我们可以不去关心,因为即使minor gc把年轻代对象清除掉,对这个老年代不会造成影响。我们要关心的是老年代指向年轻代的引用这种情况,所以在收集年轻代的时候需要处理这些引用。以 OpenJDK 中的 Parallel GC 为例,收集器通过卡表(Card T...原创 2018-12-06 23:56:18 · 3684 阅读 · 0 评论 -
浅谈JVM OOP-Klass二分模型
OOP-Klass二分模型介绍HotSpot中采用OOP-Klass模型用来描述Java对象实例OOP或OOPS(Ordinary Object Pointer)指的是普通对象指针,主要职能是表示对象的实例数据而Klass用来描述对象实例的具体类型,实现语言层面的Java类。OOP在Java应用程序运行过程中,每创建一个Java对象,在JVM内部也会相应创建一个OOP对象来表示Jav...原创 2019-03-06 23:41:35 · 3391 阅读 · 0 评论 -
堆外内存(直接内存)
1、堆外内存定义内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理(而不是虚拟机),这样做的结果就是能在一定程度上减少垃圾回收对应用程序造成的影响。使用未公开的Unsafe和NIO包下ByteBuffer来创建堆外内存。2、为什么使用堆外内存1、减少了垃圾回收使用堆外内存的话,堆外内存是直接受操作系统管理(而不是虚拟机)。这样做的结果就是能保持一个较小的堆内内存,以减少...转载 2019-05-26 11:54:03 · 1341 阅读 · 2 评论 -
深入理解G1垃圾收集器
G1(Garbage First)垃圾收集器是当今垃圾回收技术最前沿的成果之一。早在JDK7就已加入JVM的收集器大家庭中,成为HotSpot重点发展的垃圾回收技术,JDK9 默认就是使用的G1垃圾收集器。不同于其他的分代回收算法,G1最大的特点是引入分区的思路,弱化了分代的概念,合理利用垃圾收集各个周期的资源,解决了其他收集器甚至CMS的众多缺陷。每块区域既有可能属于O区、也有可能是Y区,且每...原创 2019-07-25 00:02:51 · 1107 阅读 · 1 评论 -
浅谈CMS垃圾收集器
介绍CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动JVM参数加上-XX:+UseConcMarkSweepGC ,这个参数表示对于老年代的回收采用CMS。CMS采用的基础算法是:标记–清除CMS过程1、初始标记2、并发标记3、并发预清除4、重新标记5、并发清...原创 2019-07-25 01:36:25 · 1032 阅读 · 1 评论 -
Java的即时编译
分层编译模式HotSpot虚拟机包含多个即时编译器C1、C2和GraalC1编译效率快,对应参数 -client,针对执行时间较短、或者对启动性能有要求的程序目的是使程序尽快进入编译执行阶段,所以没有收集很多,所以编译速度很快C2生成代码执行效率快,对应参数 -server,针对执行时间长的、对峰值性能有要求的程序。将编译成机器代码的时候需要收集大量的统计信息以便在编译的时候优...原创 2018-11-18 00:43:33 · 1401 阅读 · 1 评论 -
Java代码是怎么运行的
Java代码有很多运行方式。在开发工具中运行 双击jar文件运行 在命令行中运行 在网页中运行当然,上述运行方式都离不开JRE, 也就是Java运行时环境。JRE仅包含Java程序的必须组件,包括Java虚拟机以及Java核心类库...转载 2018-07-24 21:29:50 · 28671 阅读 · 1 评论 -
深入Java虚拟机笔记(五):剖析HotSpot的Launcher
虽然HotSpot只是OpenJDK项目的一个功能子集,但在其中占据非常重要的地位HotSpot目录下四大子目录: agent:包含Serviceability Agent的客户端的实现 make:用于build出HotSpot的各种配置文件 src:包括HotSpot的所有源码 test:单元测试Launcher是一直用于启动JVM进程的启动器,有两种,一种windows平台下运原创 2017-05-22 22:12:08 · 2407 阅读 · 0 评论 -
深入Java虚拟机笔记(四):类加载
1.类的加载过程 JVM将类加载过程分为三个步骤:装载(Load),链接(Link)和初始化(Initialize)链接又分为三个步骤,如下图所示:1) 装载:查找并加载类的二进制数据;2)链接:验证:确保被加载类的正确性;准备:为类的静态变量分配内存,并将其初始化为默认值;解析:把类中的符号引用转换为直接引用;3)初始化:为类的静态变量赋予正确的初始值;&...转载 2017-05-10 21:11:31 · 768 阅读 · 0 评论 -
深入Java虚拟机笔记(二):垃圾收集器与内存分配策略
程序计数器、虚拟机栈、本地方法栈三个区域随线程而生而死,栈中的栈帧随方法的进入和退出执行着出栈和入栈,所以以上区域的内存分配和回收基本不用我们考虑了。而Java堆和方法区不一样,我们常说的分配和回收的内存就指这两个。判断对象是否存活的算法需要注意的是计数算法没有被用来管理内存,主要原因它没有很难解决对象之间的相互循环引用问题1、根搜索算法(GC Roots Tracing)原创 2017-05-10 17:26:37 · 868 阅读 · 0 评论 -
深入Java虚拟机笔记(三):类文件结构
介绍各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码是构成平台无关性的基础,实现语言的无关性还是虚拟机和字节码存储格式,所以Java编译可以把Java代码编译为存储字节码的Class文件,Java虚拟机不管Class的来源是什么,反正符合Class文件结构就可以在Java虚拟机运行。所有表都习惯性以“_info”结尾,表用于描述有层次关系的复合结构的数据,整个Class文件本质就是一原创 2017-05-10 16:24:49 · 764 阅读 · 0 评论 -
深入Java虚拟机笔记(一):Java内存区域与内存溢出异常
1、程序计数器为很小的内存空间,为当前线程执行的字节码的行号指示器,通过改变计数器的值来选取下一条需要执行的字节码指令,循环、分支等基础功能都是需要计数器来完成的 2、Java虚拟机栈为Java方法执行的内存模型,每个方法被执行时都会同时创建栈帧用于存储局部变量表,操作栈、动态链接、方法出口等信息,方法被执行到结束对应一个栈帧从虚拟机栈入栈出栈 两种异常情况:如果线程请求的栈深度大于虚拟机允许的原创 2017-05-02 23:56:39 · 964 阅读 · 0 评论 -
Java的内存回收
Java虚拟机内存原型寄存器:我们在程序无法控制 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是堆中 存取速度比堆块,仅次于寄存器,栈数据可以共享,栈的数据大小与生存期必须是确定的,缺乏灵活性。 堆:存放new产生的数据 可以动态分配内存大小,生存期也不必事先告诉编译器,因为它在运行时动态分配内存,Java的垃圾收集器会自动收走这些不再使用的数据,但缺点是,由于在运行时分配原创 2017-01-19 02:04:45 · 4733 阅读 · 0 评论 -
JVM性能调优-小测试
JDK自带的jvm调优工具jvisuaLVMJava VisualVM默认的插件中心网址已关闭服务,已经把服务迁移到github,可以进入这个网址https://visualvm.github.io/pluginscenters.html查询不同JDK版本对应的插件下载地址,再把java VisualVM插件中的设置里的插件中心地址改成对应的下载地址即可。 配置eclipse配置...原创 2017-07-19 23:55:33 · 1420 阅读 · 0 评论