暂时未有相关云产品技术能力~
Java技术专家+架构师,个人公众号搜索OpenCoder
今天主要给大家介绍的是NIO的基本的概念以及Channel中常用的FileChannel的基本的用法,算是对Channel有一个简单的介绍。下一篇文章我们将详细的为大家介绍其他的常用Channel。
虽然我们现在开发中使用的JDK一般都是JDK8了但是最近还是有很多同学在面试的过程中遇到了JDK1.7的一些问题那么接下来我们就带着大家一起来聊一下HashMap在1.7中的各种问题。
JDK8中ConcurrentHashMap的结构是:数组+链表+红黑树。 因为在hash冲突严重的情况下,链表的查询效率是O(n),所以jdk8中改成了单个链表的个数大于8时,数组长度小于64就扩容,数组长度大于等于64,则链表会转换为红黑树,这样以空间换时间,查询效率会变O(nlogn)。 红黑树在Node数组内部存储的不是一个TreeNode对象,而是一个TreeBin对象,TreeBin内部维持着一个红黑树。 在JDK8中ConcurrentHashMap最经点的实现是使用CAS+synchronized+volatile 来保证并发安全
本篇文章主要给大家介绍了: 什么是哈希表 哈希冲突 HashMap定义的基本属性 HashMap的构造方法
LinkedHashMap是一个有序的map集合,他的特点就是在map的基础上增加了顺序从而让无序的map成为一个有序的集合,同时LinkedHashMap底层的实现也非常有意思。
方法的调用实际是使用了方法调用栈。递归不就是方法调用本身就是入栈和出栈的过程吗。如果是这样的话,我们就可以使用栈来替换之前的递归,在栈中存储方法每次传入的参数即可。
鸡尾酒排序,是冒泡排序算法的一种升级。冒泡排序的每个元素都可以像气泡一样,根据自身大小,一点点的向着数组的某侧移动。算法每一轮都是从左到右来比较元素,进行**单向**的位置交换的。而鸡尾酒排序是在此基础上元素比较和交换过程变成了**双向**的。固[鸡尾酒]排序又称双向冒泡排序、鸡尾酒搅拌排序、搅拌排序、涟漪排序、来回排序或快乐小时排序, 是冒泡排序的一种变形。
之前我们学习了冒泡排序,有没有比冒泡排序更快的排序算法呢?当然有,例如快速排序,归并排序,堆排序。接下来即将介绍的快速排序就是由冒泡排序演变而来的。
单边循环法是快速排序的算法之一,之前的双边循环法从数列的两边交替遍历元素,虽然更加直观,不过代码实现起来相对复杂。而单边循环法就要简单多了,只需要从数组的一边对元素进行遍历和交换即可。
二叉树是数据结构的一种,本章介绍了满二叉树和完全二叉树。以及二叉查询树的查询操作和新增操作。使用二叉树来存储数据,既可以保证顺序,又可以提高查询效率。不过最后我们发现如果二叉树长歪了,查询效率就会变低,要解决这个问题,我们需要让二叉树自己平衡。关于二叉树的自平衡下章介绍。
接上一篇JVM面试题:https://developer.aliyun.com/article/1287145?spm=a2c6h.13262185.profile.8.121f7de1fgxHPv
接下来会为大家整理JVM相关的面试题,整个JVM的复习以及面试准备分为以下六个方面即可: ①虚拟机类加载机制 ②JVM内存结构 ③JVM内存分配策略 ④垃圾收集器 ⑤JVM线上性能调优 ⑥线上OOM原因以及解决方案
之前通过三篇文章的分析,介绍了 直接内存、Metaspace和栈内存三块区域的内存溢出,同时给出了一些常见的引发内存溢出的场景以及对应解决方案,一般只要vm参数配置合理,代码上不出现大问题,一般不太容易引发对应的OOM
永久代溢出,由于到了JDK8,已经完全废弃了永久代的概念,改用与JRockit、J9一样在本地内存中实现的元空间(Metaspace)来代替,因此后续我们不再说 方法区、永久代,直接使用Metspace元空间来称呼。
什么是内存溢出?在哪些区域会发生内存溢出?请解释下直接内存OOM
作为一名Java程序员,平时在公司拼命加班、任劳任怨干活,好不容易熬夜开发完系统,测试完毕,Bug修复完毕,然后上线部署系统,系统开始正常运行,终于歇口气能好好放松下,喝杯Java压压惊了,But!上线后最害怕的事是什么?
通过之前大量的案例和工具的介绍,相信大家对于JVM优化有了一定的了解和熟悉,接下来我们将整个JVM性能优化的步骤做一个总结。
通过本篇文章的讲解,大家对于MAT工具的使用有了一定的理解和参考,后续遇到内存泄露、内存卡顿、大对象数据分析都可以直接通过MAT精准确定,更好的优化我们的项目。
我们接着上篇文章的案例继续进行分析与优化
今天给大家分享一个真实的案例,这是我之前一个朋友公司的项目在开发完毕后上线发现整个项目在线上的体验非常不好,有明显的频繁卡顿,后来经过一连串的排查、定位、分析和优化才发现原来是一条SQL引发的问题,而且该SQL语句是一位刚入职不久的工程师所写。 通过这次事故的教训也让这个团队在后续的开发中更加注重了JVM参数的设置以及GC的监控。
就目前大部分互联网创业型公司,其开发的系统几乎都不会考虑JVM性能优化这一块,哪怕一个团队中有1个技术Leader或架构师,往往都没有太多精力去把控到特别细节的地方上,以及对JVM也没有那么的精通与熟悉,这也导致一个很大的问题,大部分工程师开发完一个系统后,部署生产环境的时候根本对JVM参数什么的设置一窍不通,也就是默认的JVM参数进行系统的运行,等系统在某个时段出现问题后,开始大量分析找bug,很久也未能找出什么原因。
接上篇文章,如不清楚可以先看上一篇文章
实际开发中有很多类似的这样的应用场景,比如每秒多少个请求,每次请求分配多少对象等,我们的目的就是通过工具分析我们系统在实际运行过程中是否频繁触发GC以及对象是否频繁进入老年代引发Full GC,哪些对象存在影响性能以及没有及时回收的问题。
经过前面对于虚拟机内存分配与回收技术各方面的介绍, 相信大家已经建立了一个比较系统、 完整的理论基础。 理论总是作为指导实践的工具, 把这些知识应用到实际工作中才是我们的最终目的。 接下来的内容, 我们将从实践的角度去认识虚拟机内存管理的世界。
今天穿插一篇特别说明篇,有些同学在问YongGC、MinorGC、MajorGC以及Old GC、Full GC这么多名词到底谁是谁?搞晕了!本篇文章特别说明下
本文将介绍JVM中的三色标记算法、增量更新和原始快照的概念。 首先,我们将深入探讨JVM中的三色标记算法。这种垃圾回收算法基于可达性分析,将对象分为三个状态:白色、灰色和黑色。通过标记对象的可达性,垃圾回收器可以确定哪些对象可以安全地回收,从而有效地管理内存。 接下来,我们将介绍增量更新技术。增量更新是一种垃圾回收的优化方法,它将垃圾回收过程分为多个阶段,并与应用程序交替执行。通过这种方式,增量更新可以减少垃圾回收的停顿时间,提高应用程序的响应性能。
G1的垃圾回收流程主要是从新生代回收开始,新生代回收与并发标记再到混合回收,接下来我们就先来说第一个新生代回收。
G1是一款主要面向服务端应用的垃圾收集器。 HotSpot开发团队最初赋予它的期望是(在比较长期的) 未来可以替换掉JDK 5中发布的CMS收集器。 现在这个期望目标已经实现过半了, JDK 9发布之日, G1宣告取代Parallel Scavenge加Parallel Old组合, 成为服务端模式下的默认垃圾收集器, 而CMS则沦落至被声明为不推荐使用(Deprecate) 的收集器 。
上文我们已经介绍了CMS垃圾收集器的工作原理以及流程,本篇我们接着深入说明CMS垃圾收集器的缺点以及所导致的一些问题应该如何解决。
年轻代垃圾回收器机制我们都很清楚了,接下来我们介绍最核心的老年代垃圾回收环节。
这是当时开发中遇到的一个真实场景,也是大部分人在开发项目中有可能会遇到的一些场景,该系统主要是做大数据相关计算分析的,日处理数据量在上亿的规模。这里我们重点针对JVM内存的管理来进行模型分析,数据的来源获取主要是MYSQL数据库以及其他数据源里提取大量的数据,通过加载到JVM内存的过程我们来一起分析出现的问题以及如何优化解决
本文中用到的案例是接着上一篇文章继续的,如果有不清楚同学请先查看上一篇文章
HotSpot虚拟机中多数收集器都采用了分代收集来管理堆内存, 那内存回收时就必须能决策哪些存活对象应当放在新生代, 哪些存活对象放在老年代中。
大多数情况下, 对象在新生代Eden区中分配。 当Eden区没有足够空间进行分配时, 虚拟机将发起一次Minor GC。HotSpot虚拟机提供了-XX: +PrintGCDetails这个收集器日志参数, 告诉虚拟机在发生垃圾收集行为时打印内存回收日志, 并且在进程退出的时候输出当前的内存各区域分配情况。 在实际的问题排查中, 收集器日志常会打印到文件后通过工具进行分析 。
这篇文章将深入探讨Java中的四种引用类型:强引用、软引用、弱引用和虚引用。我们将逐一解释每种引用类型的特性和用途。
接下来我们正式进入第二个系列,关于垃圾回收以及优化。
通过之前相关JVM的基础知识学习我们可以结合一些实际生产案例来进行结合巩固和说明,我们在上线一个生产系统的时候,针对预估的并发压力,到底应该如何合理的给出一个未经过调优的比较合理的初始值。 另外我们会分析各种参数在设置的时候有哪些考虑的点,Java堆内存到底需要多大?新生代和老年代的内存分别需要多大?永久代和虚拟机栈分别需要多大?这些我们都会结合案例来一步一步的分析。 注意:JVM参数到底该如何设置,一定是根据不同的业务系统具体的一些场景来调整的,不是说有一个通用的配置和模板,照着设就没问题了,这个思路是肯定不对的,一定要结合案例和业务场景来分析。
本地方法栈和堆内存是Java虚拟机中的两个重要组成部分。 本地方法栈用于管理Java方法在执行过程中涉及的本地(Native)方法。它与Java虚拟机栈类似,但其不同之处在于本地方法栈是为本地方法服务的,而Java虚拟机栈则是为Java方法服务的。本地方法栈中包含本地方法的参数、局部变量以及方法调用和返回的相关信息。本地方法栈的内存分配和释放由JVM自行管理。 堆内存是Java虚拟机中用于存储对象实例的一块内存区域。堆内存是所有线程共享的,被用于存放Java程序中动态创建的对象。
年轻代和老年代是Java堆内存的两个主要区域,用于存储对象。年轻代是新创建的对象经过短暂存活期后存放的区域,而老年代则是经过多次垃圾回收后仍然存活的对象存放的区域。
Tomcat这种web容器中的类加载器应该如何设计实现?
常见的JVM有Oracle JDK、OpenJDK、IBM JVM、Azul Zing JVM等。Java代码的运行机制如下:首先,Java源代码被编译成字节码文件(.class文件),其中包含了可执行指令。然后,JVM将字节码加载到内存中,进行校验、准备和解析等操作。接着,JVM将字节码转换为机器码,并交给处理器执行。执行过程中,JVM负责内存管理、垃圾回收和线程调度等任务。最后,程序执行完毕或遇到异常,JVM终止程序的运行。JVM的关键组件包括类加载器、即时编译器和垃圾回收器,它们确保了Java代码的可移植性、安全性和性能优化。这些信息有助于理解Java代码是如何在JVM上运行的。
分布式存储系统的架构设计旨在实现数据的分布式存储和负载均衡,通常采用数据分片和多节点存储的方式。容错架构则是为了提高系统的鲁棒性和可用性。在分布式存储系统中,容错架构常采用数据的冗余备份来应对节点故障或网络异常问题。通过复制数据到多个节点,即使某个节点发生故障,系统仍可以提供数据的可靠访问。此外,容错架构还包括故障检测和自动故障转移机制,用于及时检测节点故障,并将故障节点的任务转移给其他正常节点。这样可以保证系统在故障情况下仍能正常运行,并提供不间断的数据访问。通过合理的架构设计和有效的容错机制,分布式存储系统可以实现高可用性和数据可靠性,满足大规模数据存储和访问的需求。
本文介绍了如何使用Spring Boot整合全局异常处理、错误码枚举和JSR 303校验。全局异常处理通过@ControllerAdvice和@ExceptionHandler注解实现,提供了统一处理异常的机制。错误码枚举用于管理和传递错误信息,将错误信息与错误码进行映射,提高异常情况的定义和管理。JSR 303校验通过注解定义验证规则,并使用@Valid注解进行数据校验,确保请求数据的有效性。通过这些技术的应用,能够提升应用程序的异常处理和数据验证能力,提高应用程序的健壮性和用户体验。
Mysql,作为一款优秀而广泛使用的数据库管理系统,对于众多Java工程师来说,几乎是日常开发中必不可少的一环。无论是存储海量数据,还是高效地检索和管理数据,Mysql都扮演着重要的角色。然而,除了使用Mysql进行日常开发之外,我们是否真正了解它的底层架构以及设计实现的流程呢?本篇博客将带您深入探索Mysql底层架构的设计与实现流程,帮助您更好地理解和应用这个强大的数据库系统。让我们一同揭开Mysql底层的神秘面纱,探寻其中的奥秘。