nihui123
现在在修炼中
展开
-
垃圾回收算法与实现系列-Java的Class文件详解
112312原创 2021-07-26 09:20:11 · 732 阅读 · 1 评论 -
垃圾回收算法与实现系列-JVM无锁实现
导语 为了确保多线程场景下数据安全,使用锁机制一直是一种优秀的解决方案,但是再高并发场景下,对锁的竞争可能成为性能瓶颈。为此,有出现了一种新的解决方案,被称为是非阻塞同步的方案。这种实现方式不需要使用锁,但依然可以保证高并发场景下数据的一致性,这一次就主要来说说这种不通过锁机制来实现数据安全的方案。文章目录无锁机制理解CAS无锁机制理解CAS 基于锁的同步方式,也是一种...原创 2021-07-05 09:37:38 · 1120 阅读 · 0 评论 -
垃圾回收算法与实现系列-锁在应用层的优化思路
导语 之前的分享中主要介绍了虚拟机内部的对锁机制的优化与具体实现,在实际的开发过程中,还可以通过在应用层的合理优化,达到保证性能的目的,那么下面就学习介绍一下在应用层中如何进行锁的优化。文章目录锁在应用层的优化思路减少持有锁的时间减小锁粒度锁分离锁粗化锁在应用层的优化思路减少持有锁的时间 对于在应用层面上进行的并发控制,在锁竞争的过程中,单个线程对锁的持有时间与系统的性能有直接的关系。线程持有锁的时间过长,那么锁的竞争就越激烈。所以在开发的过程中,应该尽量减少某个锁的占用时间,从而减少线程.原创 2021-07-02 10:20:46 · 2417 阅读 · 2 评论 -
垃圾回收算法与实现系列-锁在Java虚拟机中的实现和优化
导语 上篇分享中提到了对象头Mark Word 的基本概念之后,接下来就可以深入到虚拟机内部了。在多线程程序中,线程之间的竞争是不可避免的,并且这是一种多线程程序的常态。那么如何高效的处理多线程的竞争,是JVM的一项关键优化点,如果将所有的线程处理都交给操作系统,那么整体的处理效率比较低。所以,JVM在进入操作系统处理之前,首先就需要做好前期的准备工作,这样尽可能的避免真实场景的竞争发生。下面就来看看JVM对于锁的优化等问题。锁机制在JVM中的实现和优化偏向锁 偏向锁是JDK1.6 中提出的.原创 2021-07-01 09:38:21 · 2383 阅读 · 1 评论 -
垃圾回收算法与实现系列-线程安全与锁简介
导语 锁是多线程软件开发的必要工具,它的基本作用是保护临界区资源不被多个线程同时访问进而受到破坏。如果由于多线程访问造成数据不一致,那么系统将会得到一个错误的结果。通过锁可以让多个线程排队一个一个进入临界区访问目标对象,使目标对象的状态总是保持一致性。这个就是锁存在的价值。锁的基本概念和实现文章目录锁的基本概念和实现理解线程安全理解线程安全 通过锁可以实现线程安全,线程安全就是在多线程的环境下,无论多少的线程访问目标对象,目标对象的状态应该始终保持一致,线程访问得到的结果总是正确的。 .原创 2021-06-30 09:40:34 · 1492 阅读 · 2 评论 -
垃圾回收算法与实现系列-String在虚拟机中的实现
导语 String 字符串一直作为各种编程语言的核心内容存在。作为动态字符的一种是实现方案,应用很广泛。每一种计算机语言对于这种数据结构都进行了特殊的优化和实现。在Java中,String作为引用数据类型,虽然不是基本数据类型,但是也和基本数据类型一样的待遇。下面就来讨论一下字符串在虚拟机中的实现。文章目录String 在JVM中的实现String对象的特点有关String的内存泄漏有关String常量池的位置String 在JVM中的实现String对象的特点 在Java语言中,设计者对.原创 2021-06-24 17:28:33 · 2601 阅读 · 1 评论 -
垃圾回收算法与实现系列-Java堆内存溢出原因
导语 内存一直是所有开发人员探索的一片天地,再JVM中,内存往往会被分为几块,了解不同的内存区域对编写出优质的代码有很大的帮助。堆内存作为JVM中比较重要的区域,有很多值得我们探索的地方。下面就来介绍一下Java堆内存溢出的解决思路文章目录分析内存溢出的原因堆溢出直接内存溢出过多线程导致OOM分析内存溢出的原因 OOM 作为比较令人头痛的问题一直困扰着很多程序员,它通常出现在某一块内存空间将要消耗尽的时候,在JVM中,导致内存溢出的原因也是比较多的,这里就来主要讨论一下最为常见的几种问题,包.原创 2021-06-24 10:20:52 · 1694 阅读 · 1 评论 -
垃圾回收算法与实现系列-GC 标记-清除算法
导语 在GC 中最重要的算法就是GC标记-清除算法(Mark-Sweep GC)。在很多的场景下都还是在使用这个算法来进行垃圾回收操作。什么是GC标记-清除算法 GC标记清除是由两个阶段构成的,一个是标记阶段,就是把所有活跃对象都进行相应的标记,另一个是清除阶段,是把所有那些没有进行标记的对象,也就是所说的非活跃对象进行回收。通过这两个阶段的操作,就可以让不能被利用的内存空间重新得到...原创 2020-06-23 10:19:47 · 1281 阅读 · 0 评论 -
垃圾回收算法与实现系列-学习GC之前的准备工作
导语 在学习垃圾回收算法之前,首先需要了解什么是Heap、什么是Root、什么是Object、什么是Stack、什么是Pointer,这写概念都是什么,为什么要在垃圾回收算法中使用,使用这些东西有什么样的好处,为什么这样使用。带着这些问题来进入一个新的学习系列。文章目录对象结构对象头域指针 首先我们知道Java是一个面向对象的编程语言,这里首先需要了解的就是对象是什么,对于对象的创建...原创 2020-06-22 14:34:55 · 1414 阅读 · 0 评论 -
JVM优化系列-String对象在虚拟机中的实现
导语 String字符串在是各种编程语言中都是重头戏。各种语言中对字符串的操作都是进行有特殊化的处理,例如在C语言中根本没有字符串这个概念,在C语言中的字符串是用字符数组来表示的。在Java中,String作为非基本数据类型,也就是引用数据类型,但是在使用的时候与基本数据类型的待遇是一样的。基于C语言对于字符串的操作,在Java虚拟机中内存的分配与回收也要进行对应的操作。下面就来分享关于字符...原创 2020-02-25 12:59:14 · 2010 阅读 · 0 评论 -
JVM优化系列-JVM内存溢出的原因
导语 内存溢出(OutOfMemory)OOM,通常情况下出现在某一块内存空间快要消耗完的时候。在Java程序中,导致内存溢出的原因有很多,下面就来分享关于内存溢出的一些问题。其中包括堆内存、直接内存溢出、永久区(Java8以后叫做元数据区)溢出。文章目录堆溢出小例子直接内存溢出小例子过多的线程导致OOM永久区溢出GC效率低下引起的OOM总结堆溢出 在之前的分享中,Java堆作为内...原创 2020-02-23 14:40:42 · 6214 阅读 · 0 评论 -
JVM优化系列-常用GC参数总结
导语 在之前的分享中,提到了很多的JVM的参数这篇分享就来总结一下在实际中常用到的一些JVM的参数文章目录基本参数1、与串行回收器相关的参数2、与并行GC相关的参数3、与CMS回收器相关的参数4、与G1 回收器相关的参数5、TLAB相关参数6、其他参数基本参数格式一般都是由-X构成-Xms: 如果在运行的时候给定这个参数,表示初始化堆大小,这个堆是包含了Eden,包含了old,整个...原创 2020-02-22 16:17:16 · 2220 阅读 · 0 评论 -
JVM优化系列-对象内存分配和回收的细节
导语 通过之前的分享,了解了关于垃圾回收算法以及垃圾回收器以及其使用,下面介绍的就是在实际使用中或者说是在处理问题过程中会出现的一些问题。 在默认情况下通过System.gc()会显式的直接出发FullGC,在程序执行的过程中这个操作是一个比较低优先级的线程,所以在一般执行的时候并不会被执行到,执行了FullGC同时也是对老年代和新生代进行的回收。在一般情况下默认垃圾回收机制会自动进行...原创 2020-02-10 10:43:07 · 1678 阅读 · 0 评论 -
JVM优化系列-JVM G1 垃圾收集器
导语 G1回收器是在JDK1.7中正式使用的一种全新的垃圾回收器,它的目标是为了取代CMS回收器。G1回收器拥有独特的垃圾回收策略,和之前的任意的一种垃圾回收器都有所不同,但是从分代策略上来说依然是属于分代垃圾回收器,也分为年轻代和老年代,任然是有eden区和survivor区。但从堆结构上看,它并不要求整个的eden区、年轻代或者老年代是连续的空间。它所使用的是一个分区算法,这个后面的分享...原创 2020-01-01 16:17:23 · 3268 阅读 · 0 评论 -
JVM优化系列-JVM垃圾收集器介绍
导语 既然是串行顾名思义就是使用单线程的方式进行执行,每次执行回收的时候,串行回收器只有一个工作线程,这样对于并行能力较弱的计算机,串行回收器更多的独占线程专一执行的方面有着良好的实现,也就是说在单线程的程序中效果较好,可以在新生代和老年代,根据不同的堆空间氛围新生代串行回收器和老年代串行回收器。下面就来分别谈谈这些收集器新生代串行回收器...原创 2019-12-28 21:36:06 · 1437 阅读 · 0 评论 -
JVM优化系列-Stop-The-World实战
导语 垃圾收集器的主要任务是识别和回收垃圾对象原创 2019-12-25 16:12:53 · 2112 阅读 · 1 评论 -
JVM优化系列-Java对象引用与可触及强度
导语 垃圾回收机制本身依托于对象的可触及性,也就是从根节点开始是否可以访问到这个对象,如果可以则说明这个对象是可触及的,也就是可达的。如果访问不到说明这个对象已经不能被使用到了。到这个时候这个对象就要被进行回收了。那么一个对象是否可以回收就要对其可触及性进行分析。保证可以在相对安全的情况下进行垃圾回收。文章目录引言对象复活引用和可触及强度强引用软引用引言 判断什么情况下对象进行回收...原创 2019-12-20 15:35:50 · 1442 阅读 · 0 评论 -
JVM优化系列-详解JDK1.8 Metaspace 参数配置
导语 在JVM中除了有堆内存参数配置以外,还有一些其他内存例如方法区、线程栈直接内存等等。他们与堆内存来说是相对比较独立的内存空间。与堆内存相比较这些内存与应用程序本身的关系不大,但是如果将其放到整个的系统层面上来说的话在有效的配置之后会使得系统的稳定性和性能有一定程度上的提升。文章目录方法区的配置参数方法区的配置参数 与Java堆类似,方法区也是所有线程共享的一块区域,用于保存系...原创 2019-12-18 10:41:55 · 6640 阅读 · 0 评论 -
JVM优化系列-详解JVM堆内存分析
导语 了解过java虚拟机的读者都知道,在JVM的内存可以分为堆内存和非堆内存,在之前的博客中分享了关于JVM常见参数的配置。这次分享的内容主要是对堆和非堆内存参数的配置 在Java程序运行的过程中,如果堆空间内存不足就会出现内存溢出的现象OOM。一旦是发生了内存溢出就会导致整个应用程序的退出,在一定情况下会影响业务的正常使用。为了解决这类的问题,Java虚拟机提供了一个参数 -XX:...原创 2019-12-17 14:42:31 · 1368 阅读 · 0 评论 -
JVM优化系列-详解常用的虚拟机调优参数
导语 栈上分配是java虚拟机提供的一项优化技术,基本思想是对一些线程私有的对象,也就是不可能被其他线程访问的对象,将这些对象分开分配到栈上,而不分配到堆上,分配在栈上的优势就在于在函数调用结束之后这些对象可以自行的销毁,这样就不会调用垃圾回收机制的介入,这样就可以在一定程度上提高系统的性能。文章目录栈上分配对非逃逸对象栈上分配栈上分配 &emps;如导语中提到的栈上分配其实...原创 2019-12-16 11:12:42 · 2598 阅读 · 0 评论 -
深入了解JVM
之前看了一本书《深入理解Java虚拟机》,里面将的主要就是关于Java虚拟机的发展史,Java虚拟机的主要功能介绍,还有其他的关于Java虚拟机底层的东西。对于Java开发者来说,现在最新的JDK版本应该是JDK12,我们都知道在Java语言是夸平台的,这里的夸平台并不是指Java这个编程语言的夸平台,而是指JVM的夸平台特性。我们在不同的环境上可以使用不同的虚拟机来实现不同的平台上运行Ja...原创 2019-04-25 22:39:30 · 1895 阅读 · 0 评论