JVM性能优化源码
文章平均质量分 87
龙小虬
很懒。
展开
-
JVM性能优化------三色标记算法原理
什么是三色标记算法jvm垃圾回收期使用的,在并行标记的时候的一种算法,CMS/G1中的核心算法。把对象从逻辑上分为三种颜色,分别是黑色,灰色,白色黑色:自身和成员变量均已标记灰色:自身被标记,成员变量未被标记白色:未被标记的对象它主要用于收集器内存管理,适用于任何的垃圾收集器,也就是通用的算法。我们通过G1回收器来了解这个算法,我们都知道G1收集器分为三个步骤新生代回收过程当新生代eden区内存满的时候,G1年轻代收集器会采用并行多线程的方式清理堆内存垃圾,这时候会暂停所有用户的线程原创 2021-04-20 18:27:41 · 405 阅读 · 0 评论 -
JVM性能优化------垃圾回收器(三)
现在来讲讲G1收集器。在前面的文章晒出了一张图片,G1收集器处于老年代和新生代之间。那么这个新晋升的收集器,到底怎么样。讲G1收集器之前,我们再来回顾一下CMS收集器和传统收集器的缺点。CMS收集器和传统收集器的缺点1.碎片化问题2.标记清除算法会产生大量的碎片化的问题,如果存放一个大对象的时候,有可能会频繁的引发FullGC 使用串行老年代收集器单线程清理堆内存垃圾,触发stw问题,导致工作线程全部阻塞等待3.存放大对象如果在新生代无法存放,则会晋升到老年代存放,但是如果大对象又不是被频繁引用,而原创 2021-04-20 00:05:08 · 79 阅读 · 0 评论 -
JVM性能优化------垃圾回收器(二)
上一篇文章已经了解了传统的垃圾回收器和CMS回收器。但是关于CMS回收器的一些知识并未全部概述。我们都知道,在并发清除的时候,用户线程和GC线程是可以同时运行的,但是在这清除的过程中可能还会产生垃圾对象。这些垃圾对象,无法在本次垃圾清理的时候清理掉,这些垃圾也有一个名字,叫做:浮动垃圾。浮动垃圾CMS将无法对这些垃圾对象进行标记,由于GC线程与用户线程同时运行,最终会导致这些新产生的垃圾对象,没有被及时的回收,从而只能在下一次执行GC时释放这些之前未被回收的对象。这些垃圾也就是浮动垃圾。触发stw机原创 2021-04-19 21:52:43 · 139 阅读 · 0 评论 -
JVM性能优化------垃圾回收器(一)
前面我们使用到了System.gc();方法,可以回收垃圾。那么他具体是怎样的呢?我们来看看吧。可以看到他是C语言写的,但我现在要说的是,我们调用了System.gc();的话,垃圾并不是立马回收,而是告诉虚拟机需要进行回收了。测试代码:/** * @author 龙小虬 * @date 2021/4/16 22:54 */public class SystemGC { public static void main(String[] args) { new Sy原创 2021-04-16 23:57:43 · 399 阅读 · 3 评论 -
JVM性能优化------垃圾回收算法
在前面的文章JVM性能优化------可达性分析算法与四种引用,提到过四种算法。但是只是提了一下概念。今天我们来具体理解一下。回收算法先提及一个最大的误区,引用计数算法,在java并没有使用,而是python的回收算法!!!好了,现在我们看看java的四种回收算法。标记清除算法我们可以看到堆内存中有A、B、C、D、E、F六个对象,当B、C、E对象不再被引用的时候,那么会被直接标记,在需要回收时,进行回收。我们可以看到右边的堆内存的结构,幸存的对象的地址不是连续的,那么会产生碎片化的问题,一旦原创 2021-04-15 23:26:25 · 95 阅读 · 0 评论 -
JVM性能优化------可达性分析算法与四种引用
项目地址jvm_04在理解回收机制算法之前,我们需要了解。如何判断一个对象是否该被回收。如何判断一个对象是否该被回收在了解java的回收机制之前,我们可以了解一下,初期python的垃圾回收机制。顺带一提,比如python/java等语言都是基于c/c++来写的,但是C、C++却不存在垃圾回收机制。Java中垃圾回收是自动化的,但其可控性差,内存容易溢出。内存溢出是因为JVM内存分配的对象过多,这些对象所需内存超出了JVM内存大小。虽然Java中是自动的。但是程序员仍可调用System.gc( )原创 2021-04-14 23:30:47 · 565 阅读 · 0 评论 -
JVM性能优化------内存结构原理分析(二)
前面介绍了jvm内存结构,现在我们来介绍一下常量池。我们都知道常量的对的定义。常量是一个固定的值,不会发生改变。比如:配置文件,数据库连接池基本配置等等。常量池常量的定义在上面提到过了,那我们来了解一下常量池,简单的看就是存储常量的地方。这是百度百科的解释:常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。它包括了关于类,方法,接口等中的常量,也包括字符串常量,如String s = "java"这种申明方式;当然也可扩充,执行器产生的常量也会放入常量池,故认为常量池原创 2021-04-13 22:53:07 · 60 阅读 · 0 评论 -
JVM性能优化------内存结构原理分析(一)
前面我们了解了类加载器,类加载器是把class文件读取到jvm虚拟机内存中去。那么我们的java虚拟机内存结构是怎样的呢?我们来看这张图片。堆(JMM主存)用于存放new出的对象、数组有垃圾回收机制多线程共享,所以存在线程安全问题虚拟机栈(JMM 本地空间/工作内存/主内存的副本数据)存放局部变量、栈帧(记录方法信息、当方法执行结束之后或者抛出异常的情况,栈帧空间销毁)、栈操作这里面主要的是栈帧空间(局部变量、操作数栈、动态链接、方法地址(方法出口))虚拟机栈也叫线程栈、每个线程都有原创 2021-04-12 19:47:56 · 64 阅读 · 1 评论 -
JVM性能优化------类加载器实现原理(二)
项目地址jvm_01前面提到了双亲委派原则,是为了保证类的唯一,那么我们怎么去破坏这个机制呢?思路:直接绕开loadClass方法那么我们要怎么去绕开loadClass方法呢?有两种办法:前面我们提到了自定义加载器,所以我们可以自定义加载器Spi机制绕开loadClass方法,使用当前线程设定关联类加载器我们先来了解一下Spi机制。Spi机制Spi机制加载第三方扩展的jar包类初始化,对我们接口的类实现初始化。那么有哪些jar使用过Spi机制呢?我们很熟悉的mysql连接池就使用了原创 2021-04-12 13:33:02 · 109 阅读 · 0 评论 -
JVM性能优化------类加载器实现原理(一)
首先,我们需要了解什么是类加载器。类加载器Java类加载器(Java Classloader)是Java运行时环境(Java Runtime Environment)的一部分,负责动态加载Java类到Java虚拟机的内存空间中。---来自百度百科简洁的来说就是将class文件读取到内存中。虽说是读取class文件,那么class文件有哪些来源呢?编译自己写的java文件网络方式下载的class文件我们使用java web项目打包时,war、jar解压之后是class文件从数据库中读取c原创 2021-04-10 23:41:55 · 135 阅读 · 0 评论