这篇我们学习下jvm的clone实现,具体实现在jvm.cpp中: clone方法主要是复制对象,当然只是浅拷贝。里面一些方法等处理不清楚原因,先略过。
这篇我们学习下jvm的clone实现,具体实现在jvm.cpp中: clone方法主要是复制对象,当然只是浅拷贝。里面一些方法等处理不清楚原因,先略过。
在垃圾回收中,经常会STW,为了首先STW,jvm设计了安全点(safepoint)。那么什么是安全点?线程什么时候进入和离开安全点呢? 安全点概念 安全点:安全点可以理解为...
字符串去重是G1引入的新特性,在我们日常开发中,字符串基本上是使用最多的类型。而String对象是不可变的,通常会消耗大量的内存,这里面有一部分是冗余的。String对象有自...
混合GC(Mixed GC):既收集年轻代,也收集老年代。不同于YGC,涉及老年代回收时,引入了并发标记。并发标记指的是GC线程可以和Mutator线程同时运行。 并发标记 ...
在内存分配的时候,如果剩余空间不能满足分配的对象就会触发YGC。G1每次都会收集所有的新生代的分区,但新生代分区的数目每次可能是不一样的,这是因为G1会根据时间预测模型来调整...
RSet和卡表 试想一下,当在ygc时,我们需要扫描整个新生代。当新生代的对象被老年代引用,则此对象就不能回收。那么怎么判断这点呢,总不能扫描老年代吧。所以这里需要使用空间换...
上文分析了Java类的加载过程,那么Java对象的创建过程是什么样呢? 以上为例,看下new关键字在底层是怎么实现的。new关键字实现在InterpreterRuntime类...
环境 本系列学习笔记基于openjdk-8u60版本 OOP-Klass二分模型 Hotspot基于C++实现,而C++本身也是一门面向对象的语言,那么是否只需要对每个Jav...
这段时间在公司搞序列化相关的优化,这里做下笔记吧。 项目背景 项目采用dubbo(版本不自带protostuff序列化),接口参数为byte[],这里的byte[]是由应用先...
protobuf介绍 以上为官网介绍,主要有三大特点: 语言无关、平台无关; 性能好 扩展性好尤其是在微服务场景中,rpc调用非常频繁,使用合适的序列化协议会大大提高系统的性...
缓存过期算法 LFU(Least Frequently Used,最近最不常用)根据最近使用的频率来淘汰频率低的数据。核心思想是:如果数据过去多次被访问,那么将来被访问的概率...
guavacache是google出的一个开源本地缓存库,适用于高并发场景。本文基于28.1-jre版本 基本特性 数据自动加载缓存中 缓存达到最大限制时,使用LRU算法进行...
前言 G1系列主要参考的是《G1源码分析和调优》和openjdk-8u40代码 在【Java对象的创建过程】一文中也说到了对象的分配,但说的不够细,这篇再从G1的角度说下对象...
我们知道JDK原生的Timer、ScheduledThreadPoolExecutor都可以处理定时任务。但它们都是基于小顶堆/大顶堆,因此添加任务和删除任务的时间复杂度都是...
Mpsc(Multi producer single consumer)即多生产者单消费者队列,是Jctools中的高性能队列,也是netty经常的队列,如EventLoop...
在PoolArena分析中,我们知道每次申请内存时,除Huge外,其余均先从PoolThreadCache尝试获取内存。PoolThreadCache顾名思义是线程缓存,作用...
PoolArena是全局分配内存的类,该类是一个抽象类,实现分为Heap和Direct。 类属性 初始化init方法和PoolChunkList构造方法将PoolChunkL...
为了减少chunk的内存碎片,netty将chunk按内存使用率分为6种状态:QINIT,Q0,Q25,Q50,Q75,Q100。并使用PoolChunkList存储这些ch...
PoolChunk负责8KB-16MB的内存分配,那如果小于8KB呢,比如申请64B,此时用PoolChunk分配就显得浪费了,netty用PoolSubpage来分配小于8...
PoolChunk是netty内存池中负责较大内存块的维护(PoolChunk默认会申请16MB),当申请超过8KB的内存时会找PoolChunk申请。 数据结构 PoolC...