- 博客(10)
- 收藏
- 关注
原创 Java并发编程
并发问题是指在多线程的场景下,由于操作系统的线程调度、JIT即时编译器重排序、处理器指令重排序和多级缓存,程序的执行结果和程序编程所期望的结果并不一致。
2021-09-19 20:48:08
838
原创 探究JVM(七)从论文角度剖析增量更新和原始快照
引言:在JVM中,使用可达性分析算法来判断一个对象是否存活。在Serial和Parallel收集器中,可达性分析的过程是STW的,这意味着在标记的过程中,对象的引用关系没有发生改变,从GC Root开始扫描,可以得到全部存活的对象。但是在CMS,G1等垃圾收集器中,采用了并发标记的方式来遍历对象图,毫无疑问,这缩短了STW的时间,但是也带来了新的问题,而增量更新和原始快照就是用来解决这个问题的不同方式。一 并发标记的问题采用了并发标记,可以让用户线程和GC线程同时工作,但是也带来了新的问题。1 浮动垃
2021-06-10 15:24:44
2695
3
原创 探究JVM(六)判断对象是否存活?可达性分析算法
引言:JVM在进行GC的时候,要确定哪些对象是存活的,或者说哪些对象正在被使用,这些正在使用的对象是不能进行回收的。那么如何确定这个对象是否存活呢?
2021-06-07 20:33:32
306
原创 探究JVM(五)G1垃圾回收器的记忆集
引言:在前面两篇博文中,主要讲述的是经典垃圾回收器中的记忆集,在经典垃圾回收器中,记忆集主要通过Card Table来实现。而在G1垃圾回收器中,记忆集的结构发生了较大改变。为什么单纯的Card Table结构不再适用?在G1垃圾回收器中,老年代和新生代的划分不再固定,取而代之的是整个堆被分成了若干个Region,每一个Region可以被当做Old,Eden,Survivor,Humongous 区域来使用。如果这时候再使用Card Table结构,就要对整个堆进行划分卡页(因为老年代不是固定的),这显
2021-06-05 18:53:52
1649
14
原创 探究JVM(四)利用写屏障技术来维护记忆集
引言:在JVM中,使用到了记忆集这种数据结构来解决跨代引用的问题,使得仅花费很小的代价就知道了哪些老年代区域上的对象包含了指向新生代的指针,从而避免了扫描整个老年代。但是现在有一个问题,由于在运行的过程中,引用关系可能随时发生改变,那么怎么样让虚拟机即使知道这种变化,并且记录下来呢?写屏障技术就闪亮登场了!什么是写屏障技术?大家都知道,在Spring框架中,采用了AOP来增强Bean实例的方法,写屏障技术和AOP技术类似,AOP技术在方法的前后增加特定的环节来增强目标方法的功能,写屏障技术在写操作的前后
2021-06-03 12:58:17
430
原创 探究JVM(三) 经典收集器的记忆集
引言:基于经典分代理论,虚拟机的堆内存可以划分成新生代,老年代。当虚拟机需要仅对新生代进行回收时(Minor GC),新生代中可能存在跨代引用,即老年代的对象中有指向新生代对象的引用。为此,正常情况下需要扫描整个老年代来确定哪些对象引用了新生代的对象,但这种方式的开销太大,所以JVM引入了记忆集的概念,采用记忆集的方式,能有效减小开销。G1收集器出现之前的记忆集首先,我们要了解记忆集(Rset)的概念,下面是ORACLE官方对于记忆集的解释The data structure for keeping
2021-06-02 14:43:24
393
原创 探究JVM(二)理解JDK 7 中的String.intern()
引言:String.intern() 被用来往字符串常量池中添加字符串,使得字符串的值可以复用,从而降低了内存开销。String.intern() 在JDK 7 中发生了重大变动,理解String.intern()改动后的原理能帮助我们正确使用它。
2021-05-30 15:55:50
503
3
原创 探究JVM(一)JDK 8 以后内存区域的变化
引言:熟悉Java内存自动分配的机制,就更能掌握垃圾回收器的设计和工作原理。在JDK 8 版本后,JVM内存区域发生了较大的改动。在JDK 8 之前采用永久代来实现方法区,但是永久代的内存分配受制于JVM虚拟机管理的内存区域,在运行时动态大量生成类的情况下,内存容易溢出,所以在JDK 8 以后采用元空间来实现方法区。
2021-05-30 11:08:18
1029
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅