JVM
散_步
但行好事,莫问前程
展开
-
分代收集算法
分代收集算法: 增量收集算法、分区算法:原创 2021-05-20 23:22:25 · 68 阅读 · 0 评论 -
标记-压缩算法
标记压缩算法: 指针碰撞: 优点: 消除了标记-清除算法当中,内存区域分散的缺点,我们需要给新对象分配内存时, JVM只需要持有一个内存的起始地址即可。 消除了复制算法当中,内存减半的高额代价 缺点: 从效率上来说,标记-整理算法要低于复制算法 移动对象的同时,如果对象被其他对象引用,则还需要调整引用的地址 移动过程中,需要全程暂停用户的应用程序,即STW ...原创 2021-05-18 23:43:47 · 642 阅读 · 0 评论 -
复制算法
复制算法: 优点: 没有标记和清除过程,实现简单,运行高效 复制过去以后保证空间的连续性,不会出现碎片问题 缺点: 此算法的缺点也是很明显的,就是需要两倍的内存空间 对于G1这种分拆成为大量的region的GC,复制而不是移动,意味着GC需要维护 region之间对象引用关系,不管是内存占用或时间开销也不小 特别的: 如果系统中垃圾对象很多,复制算法需要复制的存活对象数量并不会太大,或者说非常低才行。 ...原创 2021-05-18 23:37:22 · 424 阅读 · 0 评论 -
标记清除算法
标记-清除(Mark-Sweep)算法: 执行过程: 当堆中的有效内存空间被耗尽的时候,就会停止整个程序,然后进行两项工作,第一项则是标记,第二项则是清除。 标记: Collector从引用根节点开始遍历,标记所有被引用的对象,一般是在对象的Header中记录为可达对象。 清除:Collector对堆内存从头到未进行线性的遍历,如果发现某个对象在其Header中没有标记为可达对象,则将其回收。 缺点: 效率不算高 在进行GC的时候,需要停止整个应用程序,导致用户体验差 这种方式清理出来的空闲内存时不连续原创 2021-05-18 23:32:12 · 431 阅读 · 0 评论 -
可达性分析算法
可达分析算法: 相对于引用计数算法而言,可达性分析算法不仅同样具备实现简单和执行高效等特点,更重要的是该算法 可以有效地** 解决在引用计数算法中循环引用的问题,防止内存泄漏的发生** 所谓GCRoots根集合就是一组必须活跃的引用: 在Java语言中,GCRoots包含以下几类元素: 除了这些固定的GCRoots集合以外,根据用户所选用的垃圾收集器以及当前回收的内存区域不同,还可以有其他对象临时性加入,共同构成完整GCRoots集合,比如 分代收集和局部回收 小技巧: 由于Root,采用原创 2021-05-18 22:48:18 · 268 阅读 · 0 评论 -
引用计数算法
垃圾标记阶段:对象存活判断 在堆里面存放着几乎所有的java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中 哪些是存活对象,哪些是已经死亡的对象。只有标记为已经死亡的对象,GC才会在执行垃圾 回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段 判断对象存活一般有两种方式: 引用计数算法和可达性分析算法 ...原创 2021-05-18 22:37:00 · 67 阅读 · 0 评论 -
虚拟机栈
虚拟机栈: 优点,跨平台,指令集小,编译器容易实现 缺点,性能下降,实现同样的功能需要更多的指令 栈是运行时的单位,而堆是存储的单位 栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。 堆解决的是数据存储的问题,即数据怎么放、放在哪 java虚拟机栈是什么? 每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧,对应着一次次的Java方法调用 ,线程私有的 生命周期和线程一致 作用: 主管Java程序的运行,它保存方法的局部变量、部分结果、并参与方法的调用和返回。 栈的特点(优点): 栈是原创 2021-05-17 22:49:57 · 90 阅读 · 0 评论 -
程序计数器
介绍: JVM中的程序计数寄存器中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息, CPU只有把数据装载到寄存器才能够运行。 这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器会更加贴切, 并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟 作用: PC寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令? 它是一块很小的内存空间,几乎可以忽略不计。也是运行速度最快的存储区域。 在JVM规范中,每个线原创 2021-05-16 23:27:25 · 170 阅读 · 0 评论 -
运行时数据区基础理论
图解: JVM的内存布局: 关于线程间共享的说明: 线程: 线程是一个程序里的运行单元。JVM运行一个应用有多个线程并行的执行。 在HotspotJVM里,每个线程都与操作系统的本地线程直接映射。 当一个Java线程准备好执行以后,此时一个操作系统的本地线程也同时创建,Java线程执行终止 后,本地线程也会回收、 操作系统负载所有线程的安排调度到任何一个可用的CPU上,一旦本地线程初始化成功,它就会调用 java线程中的run()方法。 ...原创 2021-05-16 22:55:33 · 54 阅读 · 0 评论 -
jvm-类加载子系统
类加载器与类加载过程: 加载: 1.通过一个类的全限定名获取定义此类的二进制字节流 2.将这个字节流所代表的静态静态存储结构转化为方法区的运行时数据结构 3.在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口 补充:加载.class 文件的方式 从本地系统中直接加载 通过网络获取,典型场景,WebApplet 从zip压缩包中读取,成为日后jar、war格式的基础 运行时计算生成,使用最多的是:动态代理技术 由其他文件生成,典型场景:JSP应用 从原创 2021-05-15 22:07:43 · 88 阅读 · 0 评论 -
分析GC日志
GC日志参数: -verbose:gc 输出gc日志信息,默认输出到标准输出 -XX:+PrintGC 输出GC日志。类似:-verbose:gc -XX:+PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志,并在进程退出时输出当前内存各区域分配情况 -XX:+PrintGCTimeStamps 输出GC发生时的时间戳 -XX:+PrintGCDateStamps 输出GC发生时的时间戳(以日期的形式,如原创 2021-05-03 18:14:43 · 154 阅读 · 0 评论 -
垃圾回收器
GC分类: 按照线程数分,可以分为串行垃圾回收器和并行垃圾回收器 按照工作模式分为,并发式垃圾回收器和独占式垃圾回收器: 并发式垃圾回收器,与应用程序线程交替工作,以尽可能减少应用程序的停顿时间。 独占式垃圾回收器,一旦运行,就停止应用程序中的其他所有线程,直到垃圾回收过程完全结束。 按碎片处理方式可以分为压缩式垃圾回收器和非压缩式垃圾回收器: 压缩式垃圾回收器会在回收完成后,对存活对象进行压缩整理,消除回收后的碎片。 非压缩式的垃圾回收器不进行这步操作。 按工作的内存区间,又可分为年轻代垃圾回收器和老年原创 2021-05-03 16:23:49 · 97 阅读 · 0 评论 -
jvm
为什么使用双亲委派模型? ClassLoader在加载类的时候,必须先把任务委托给父类加载器,如果说父类加载器没有加载到这个类的时候,就反回来委托给它的发起者,又发起者自己本身来加载这个类,如果自己都没有加载成功的话,就会报类加载不到异常ClassNotFoundException,使用双亲委派模型主要是为了避免类的重复加载.也就是说当我们的父类已经加载这个类的时候,就没有必要子类加载这个类.原创 2017-10-16 23:05:28 · 181 阅读 · 0 评论