先打好基础,阿里架构师一文带你深入理解JVM内存回收机制

面试官:讲一下什么是负载均衡,什么是轮询策略、随机策略、哈希策略 本文已收录GitHub,更有互联网大厂面试真题,面试攻略,高效学习资料等 什么是负载均衡? 先举个例子吧。以超市收银为例,假设现在只有一个窗口、一个收银员: 一般情况下,收银员平均 2 分钟服务一位顾客,10 分钟可以服务 5 位顾客; 到周末高峰期时,收银员加快收银,平均 1 分钟服务一位顾客,10 分钟最多服务 10 位顾客,也就是说一个顾客最多等待 10 分钟; 逢年过节,顾客数量激增,一下增加到 30 位顾客,如果仍然只有一个窗口和一个收银员,那么所有顾客就只能排队等候了,一个顾客最多需要等待. 阅读详情

本文已收录GitHub,更有互联网大厂面试真题,面试攻略,高效学习资料等

一、垃圾回收发生的区域

堆是java创建对象的区域(String对象在常量池中),也是垃圾回收最多的地方。但是除了堆空间还有方法区存在需要回收的垃圾

回收方法区

废弃的常量

在常量池中存在一个字面量A,如果系统中没有一个地方引用`A``,这时候发生垃圾回收,如果有必要这个字面量就会被清理出常量池。

注意是如果有必要。比如上一篇文章中引用的例子,就没有回收字符串。

无用的类

当满足以下条件时,这个类就可以被回收,而不是一定会回收。

  1. 所有的类实例都已经被回收也就是java堆里面不存在该类的任何实例
  2. 加载类的ClassLoader已经被回收
  3. 该类对应的Java.long.Class对象任何地方被引用,无法通过反射访问该类的方法。

二、如何判断对象是否可以被回收

java有一个非常大的好处就是会自动进行垃圾回收,而不用手动释放对象所占用的内存。当以一个对象不再被引用的时候就可以进行垃圾回收,那么如何判断一个对象是否在被使用呢?

引用计数法

引用计数法很简单,只需要在对象创建之初给对象加一个引用计数器,每当有一个地方引用他就+1,引用失效就-1,当引用计数器为0,则对象不再被引用。每次垃圾回收,只需要遍历一遍所有的引用计数器就可以。但是对于循环引用,引用计数法则无法释这两个对象。

可达性分析算法

通过一系列被称为GC Root的对象为起点,从这些节点往下搜索,搜索走过的路径称之为引用链,当一个对象到GC Root没有任何引用链的时候,则证明此对象不可达。

图1  可达性分析示例图

在JVM中,可以被用作GC Root的对象有:

  • 虚拟机栈中引用的对象
  • 方法区中静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中引用的对象

三、HotSpot实现

枚举根节点

对于根节点的枚举有如下的问题:

  1. 可以作为根节点(GC Roots)的节点主要是全局性的引用(方法去中静态属性引用的对象和方法区中常量引用的对象)与执行上下文(栈中引用的对象)
  2. 在一次可达性分析过程中,不能出现分析过程中对象引用关系还在不断变化的情况,否则无法保证分析结果的准确性,为了达到这一目的,GC过程中就必须停顿所有的java线程
  3. 垃圾收集时,手机线程会对栈上的内存进行扫描,看看哪些位置存储了Reference类型,如果发现某个位置确实存的是Reference类型,整个Reference所引用的对象就可以作为根节点,
    他所能到达的对象都不能被回收。
  4. 栈上的本地变量表中只有一部分是Reference类型,而那些非Reference类型的数据对于垃圾回收毫无用处,但是如果对于栈进行全栈扫描将会是一种对时间和资源的浪费,尤其是暂停了用户线程

解决方法

是否可以用额外的空间记录下每个Reference的位置,这样的话GC的时候从这个结构中直接读取这个结构,而不用进行全栈扫描。事实上,大部分主流的虚拟机也确实是这样做的,以HotSpot为例,它使用一种OopMap的数据结构来保存这类信息。

一个栈意味着一个线程,而一个栈桢代表了一个方法,每个被JIT编译过后的方法会在一些特定的位置记录下OopMap记录了执行到该方法的某条指令的时候,栈上和寄存器的哪些位置是引用,这样GC在扫描到这些栈的时候就会查询这些OopMap就知道哪里是引用。这些位置主要在:

  • 循环的末尾
  • 方法临返回前/调用方法的call指令之后
  • 可能抛出异常的位置

而这些位置就被称之为“安全点”,之所以要选择一些特定位置来记录OopMap,是因为如果对每条指令的位置都记录OopMap的话,这些记录就会比较大,那么空间开销就会显得不值得。

GC发生时,程序首先运行到最近的一个安全点停下来,然后更新自己的OopMap,枚举根节点时,递归遍历每个栈桢的OopMap,通过栈中记录的被引用的对象的内存地址,即可找到这些对象。

安全点与安全区域

安全点

程序在执行时并不是任何时间都可以进行GC,只有到达有OopMap记录的位置才可以执行GC,整个位置称之为安全点

安全点的选定基本是以程序“是否具有让程序长时间执行的特征”为标准选定的。程序一般不会因为指令流太长而长时间执行(每个指令执行的时间都很短)。“长时间执行”的典型特征就是指令序列的服用,例如:循环、递归、方法调用。所以具有这些功能的指令才会产生安全点。

安全区域

安全区域指在这一段代码之中,引用关系不会发生变化,在这一段代码之中,任一点都是安全点。任何一个地方都可以中断线程开始GC。

当线程执行到安全区域后,首先标识自己已经进入安全区域,那么这段时间JVM要发起GC时就不用管标记自己进入安全区的线程。线程要离开安全区时,首先需要先检查系统是否已经完成了根节点的选举,如果完成则线程继续执行,否则要继续等待收到可以安全离开安全区的信号。

如何保证GC发生时,所有的线程都跑到了安全点上呢?

当要进行GC的时候,会让所有的线程都在安全点中断,就有两种方式:

  • 抢占式中断:不需要代码配合。当GC发生时,让所有的线程都终端,然后让不在安全点的线程继续执行到安全点上。不过一般不采用这种方式
  • 主动式中断:当GC需要中断线程时,不对线程进行操作,仅设置一个标识。各个线程轮询这个标识,当发现这个标识被设置时,使得程序运行到最进的安全点时,主动挂起。

标识的设置和安全点是重合的,标识的设置和安全点是重合的。除此之外还有一个创建对象需要分配内存的地方。

四、垃圾回收算法

假设存在如下的内存区域:

图2  原始情况内存中对象的分布

下文将以这块内存为例进行垃圾收集算法的分析

标记-清除算法

顾名思义,标记清除算法会为两个阶段,1-标记,2-清除。

标记:垃圾收集器从GC Roots出发,进行搜索,然后对所有可以访问的对象打上标识,标记其为可达的对象,标记一般保存在header中

图3  标记阶段

清除:垃圾收集器对堆内存进行线性遍历,如果发现某个对象没有被标记为可达,就会将其回收,回收后效果如下图

图4  标记清除算法进行垃圾回收

优点

  1. 实现简单
  2. 与保守式GC算法兼容

缺点

  1. 内存碎片化严重
  2. 分配速度缓慢,由于空闲块的维护是用链表实现的,分块可能不连续,每次分配都需要遍历链表,极端情况下要遍历震整个链表。
  3. 标记和清除的效率都不高,

复制算法

复制算法,就是将内存划分为相等的两块,每次只是用其中一块,当这块内存使用完了就将还存活的对象复制到另一块,然后将这块空间清理掉,这样使得每次对内存的回收都是半区回收。

复制算法的示意图如下图:

图5  复制算法

优点

  1. 内存分配时不用考虑碎片的情况只需要移动栈顶指针分配内存即可
  2. 实现简单,高效

缺点

  1. 可用内存缩小为原来的一半

标记—整理算法

复制算法在对象存活较多的时候会进行较多的操作,如果对象全部存活复制将会进行100%,并且浪费50%的内存空间作为担保。

标记—整理算法和标记—清除算法前半部分一样,只是后续不是清理,而是让所有存活的对象都向一端移动,然后清理掉边界以外的内存。

图6  标记整理算法

五、JVM中使用的垃圾收集算法

在当前主流的垃圾收集器当中(g1除外),基本都采用一种分代收集算法。根据对象存活周期,将java堆分为新生堆和老年堆。对于新生堆,采用复制算法,对于老年堆采用标记-清除或者标记-整理算法。

研究人员发现大多数的对象都是“朝生夕灭”,对于这样的对象,生存周期很短,可以将其放入新生堆,因为其生存时间很短,所以新生堆采用复制算法的时候没有必要使用1:1的比例划分内存。

而是分为较大的Eden空间和两块较小的Suvivor空间;HotSpot的Eden和Suvivor的比例为8:1。回收时将Eden和一块Suvivor上还存活的对象,一次性copy到另一块Suvivor上,然后清理掉以前的两块区域。这样每次新生代可用的内存空间占整个新生堆的90%,只有10%会被浪费。

我们没有办法保证新生代回收的时候只剩下不多于10%的对象存活。当Suvivor空间不够用时,就需要依赖其他内存(老年堆)进行分配担保。对于存活过一定gc次数的对象放进老年堆。

老年堆对象存活率高,使用复制算法可能就需要1:1的空间,这样就会浪费内存,因此使用的是标记-清除或者标记-整理算法。

六、GC的分类

保守式GC

HotSpot虚拟机在栈上使用OopMap记录下了哪些位置是引用类型,根据记录的类型类型开始查找堆中存活的对象。

虚拟机最初的实现当中是没有记录每个数据的类型的,JVM也无法区分内存里某个位置的数据到底应该解读为引用类型还是其他数据类型,这种条件下,实现出来的GC就是“保守式GC”。在进行GC时,JVM开始从一些已知的位置(例如栈)开始扫描内存,扫描的时候每看到一个数字就看看它“像不像是一个指向GC堆中的指针”。

这里会涉及上下边界检查(GC堆的上下界是已知的)、对齐检查(通常分配空间的时候会有对齐要求,假如说是4字节对齐,那么不能被4整除的数字就肯定不是指针),之类的。然后递归的这么扫描出去。

优点

  1. 实现简单

缺点

  1. 会有部分对象本来应该已经死了,但有疑似指针指向它们,使它们逃过GC的收集。会有一部分已经不需要的数据占用着GC堆空间,但是所有应该存活的对象都会活着,对程序语义来说时安全的
  2. 由于是疑似指针,那么就不知道这个到底是不是指针,所以这些值就都不能改写。移动对象就需要改写指针,也就是说对象不可移动,因此一般使用标记-清除的方式来进行垃圾回收。

有一种办法可以在使用保守式GC的同时支持对象的移动,那就是增加一个间接层,不直接通过指针来实现引用,而是添加一层“句柄”(handle)在中间,所有引用先指到一个句柄表里,再从句柄表找到实际对象。这样,要移动对象的话,只要修改句柄表里的内容即可。

半保守式GC

保守式GC没有在JVM中记录任何类型信息,半保守式GC会在对象上记录类型信息,这样的话,扫描栈的时候仍然和保守式GC一样,但是扫描到堆上的时候,对象上带了足够的类型信息,JVM就能判断出栈中这个位置是不是一个指向堆中对象的指针,以及这个对象内什么位置数据是引用类型,这种是“半保守式GC”,也称之为“根上保守”。

由于半保守式GC在堆内部的数据是准确的,所以它可以在直接使用指针来实现引用的条件下支持部分对象的移动,方法是只将保守扫描能直接扫到的对象设置为不可移动(pinned),而从它们出发再扫描到的对象就可以移动了。

准确式GC

对于垃圾回收,JVM关心的就是扫描的根节点是不是一个指向堆内存的指针,那么就是在栈上记录下那个位置式引用类型,是指向堆上对象的指针,在HotSpot虚拟机中这个数据结构就是OopMap

总结

  1. 垃圾回收不止是发生在堆区,对于方法区中产生的垃圾有可能会被回收。在之前的从JDK源码理解java引用一文中举了不会被回收的例子
  2. 虚拟机一般采用引用可达性分析算法来寻找不被使用的对象,其实寻找到的是正在被使用的对象,剩下的就是不再被使用的对象。
  3. 除了g1垃圾收集器。其他的垃圾收集器都有明显的区分老年代和新生代进行垃圾回收,由于老年代和新生代对象存货时间不一样,采用不同的垃圾回收算法
阿里架构师一文详解微内核架构,原来微内核这么简单 本文已收录GitHub,更有互联网大厂面试真题,面试攻略,高效学习资料等 微内核架构(Microkernel Architecture),也被称为插件化架构(Plug-inArchitecture),是一种面向功能进行拆分的可扩展性架构,通常用于实现基于产品(原文为 product-based,指存在多个版本、需要下载安装才能使用,与 web-based 相对应)的应用。例如 Eclipse 这类 IDE 软件、UNIX 这类操作系统、淘宝 App 这类客户端软件等,也有一些企业将自己的业务系统设计成.. 阅读详情

相关推荐

面试官:请比较一下SpringCloud与Dubbo

一、Dubbo 1. Dubbo简介 Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。 Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。 现已发展成为Apache的顶级孵化开源项目,详见官网: 2. Dub...

Java_Cappuccino的博客 1674

谈谈自己对内存回收的理解

内存回收,是内核在内存不足的情况下,一种释放内存的方法,在4.4.198内核里,主要有两个函数涉及内存回收,一个是kswapd,一个是drop_cache; 先说说kswapd,这是一个内核线程,每个内存节点都有一个这样的内核线程,名字是kswapd%d;在alloc_page函数中用低水位分配内存失败后,进入慢速路径的第一件事情 static inline struct page * __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,

kaka__55的博客 836

解决PADs VX2.7安装中的License失效与软件卡死问题

本文详细解析了PADs VX2.7安装过程中常见的License失效与软件卡死问题,提供了从破解工具选择、环境变量设置到输入法兼容性调整等实用解决方案。特别推荐使用Siemens EDA系列新版破解工具,并分享性能调优与定期维护技巧,帮助工程师高效解决安装难题。

weixin_29234239的博客 813

Java的内存回收机制

Java的内存回收机制  在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险。但是,也正因为内存管理完全由JVM负责,所以也使Java很多程序员不再关心内存分配,导致很多程序低效,耗内存。因此就有了Java程序员到最后应该去了解JVM,才能写出更高效,充分利用...

倚楼北望 302

Loupe Browser实战指南:解锁10xGenomics单细胞数据的可视化奥秘

本文提供了Loupe Browser的实战指南,帮助用户无需编程即可探索和可视化10xGenomics单细胞数据。文章详细介绍了从数据导入、界面导航到细胞亚群鉴定、差异基因分析的核心操作流程,并分享了高级技巧与避坑指南,是快速上手这一强大可视化工具的必备参考。

weixin_29313423的博客 206

Yolov5自学笔记之一--从入门到入狱,功能强大不要乱用(实现yolov5的基本功能使用流程及训练自己的数据集)

零基础自学yolov5,学会简单使用和训练自己的数据集,在自己工作中使用

qq_41597915的博客 1万+

Jvm gc 那些对象可以作为gc的根节点

线程对象等 转载于:https://my.oschina.net/ironthrone/blog/1839127

chihoulu7885的博客 1263

AI自瞄原理剖析(四)从Yolo推理坐标到屏幕坐标:基于FOV视角与焦距的坐标变换与精准瞄准

从Yolo推理框架得到的坐标到屏幕坐标的转换是一个涉及到FOV视角、焦距以及分辨率的复杂过程。通过数学公式,我们可以将推理框坐标反推为游戏内的实际坐标,并最终映射到屏幕坐标系中。利用这些信息,AI自瞄系统能够精确计算出准星从当前位置移动到敌人位置的距离,实现精准的自动瞄准。通过这种方法,AI自瞄系统能够在不同的游戏环境下灵活应对,提供高度精确的操作体验。在AI自瞄系统中,目标检测仅仅是第一步,获取到预测框的坐标后,我们还需要将这些坐标转换为实际屏幕上的精确位置。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1334

静态链表的java实现

package chailong; import java.util.Scanner; class Pointt { int data; //数据域 int cur; //下标域 public Pointt() { this.data=-1; this.cur=-1; } } public class Staticlinklist{ static Pointt[]...

qq_43456605的博客 414

北斗导航 | 2023 PTTI会议论文 2023 ITM会议论文 2022 ION GNSS+ 会议论文下载:ION 美国导航学会

2023 国际技术会议(ITM) 2023 精密时间和时间间隔系统和应用会议(PTTI) 2022 美国导航学会国际会议(ION GNSS +)

尘世冰封的专栏 4613

【Mode Management】AUTOSAR架构下RH850-F1KM芯片深度休眠配置实践

AUTOSAR架构下RH850-F1KM芯片深度休眠配置实践

qq_36056498的博客 1089

java中的内存回收机制_Java 中的内存回收机制

在计算机科学中,垃圾回收(英语:Garbage Collection,缩写为GC)是指一种自动的存储器管理机制。当某个程序占用的一部分内存空间不再被这个程序访问时,这个程序会借助垃圾回收算法向操作系统归还这部分内存空间。垃圾回收器可以减轻程序员的负担,也减少程序中的错误。垃圾回收最早起源于 LISP 语言。当前许多语言如 Smalltalk、Java、C# 和 D 语言都支持垃圾回收器。0x00 ...

weixin_33358099的博客 895

【华为OD机试真题E卷】300、 出租车计费 、靠谱的车 | 机试真题+思路参考+代码分析(C++、Java、Py、C语言、JS)

题目描述 >程序员小明打了一辆出租车去上班,出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大,出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常 >  比如: 1、23再多一块钱就变为25; 2、39再多一块钱变为50; 3、399再多一块钱变为500; >  小明识破了司机的伎俩,准备利用自己的学识打败司机的阴谋,给出计费表的表面读数,返回实际产生的费用

KJ.JK 4万+

准备了2个月零21天,面试字节跳动挂在了第三面JVM上

作者:鲁班学院链接:https://ke.qq.com/course/459260?flowToken=1017442JVM的重要性很多人对于为什么要学JVM这个问题,他们的答案都是:因...

HollisChuang's Blog 1497

引以为戒:一个“看不见”的空格,导致上下文超限——从 `llama-server` 错误说起

文章摘要: 本文分享了Qwen工程团队在部署llama-server时遇到的参数失效问题:明明设置了-c 32768上下文参数,却仍报错"超出4096 tokens限制"。经排查发现,问题根源是批处理脚本中续行符^后存在两个空格,导致参数被忽略。文章详细解析了Windows批处理中^的严格语法规则(必须紧贴前字符),对比了错误与正确写法的差异,并给出4条实用建议:使用编辑器显示空白字符、调试时关闭@echo off、预检完整命令、优先单行命令。最后强调在AI系统部署中,此类"隐

刘一说的IT专栏 541

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

纯干货丨18个软件开发常见问题及解决策略,你有遇到吗?

本文转载自:纯干货丨18个软件开发常见问题及解决策略,你有遇到吗? No.1 每次看这些架构的思想方法的时候,总是和实际的应用没能很好的结合起来,原因是不是架构设计的实践不够?或者是对各种实现的分析和思考太少? 我觉得不仅要有架构实践,还要有不同场景的实践。 举个例子来说,你平时做企业应用架构,没什么流量,没多少数据,复杂的地方都在业务逻辑,这时候你去看那些讲大数据、讲高并发的文章,很难带入到场景去。 还有就是一些架构,不自己搭一遍是很难了解其中的优缺点的,这也是另一个原因。 可以考虑有机会自己尝试,把看

Java_Cappuccino的博客 4997

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

阿里架构师分享丨Java架构设计的重点知识和学习路径(建议收藏)

本文已收录GitHub,更有互联网大厂面试真题,面试攻略,高效学习资料等 学习架构呢,要掌握的东西有很多,你是不是开始担心自己一辈子都学不完呢?其实,我们也不需要一下子铺开学习所有的架构技能,重要的是把控好学习的节奏,在适当的时间学习适当的内容,我们可以结合实际工作,一步步地成长。所以今天这一讲,我想给你提供一些架构学习的重点方向和路径建议。 架构原则汇总 在技术架构篇,我针对系统的高可用、高性能、可伸缩和低成本,给你介绍了很多的架构设计原则,不同的原则对应着不同的目标,这里我把这些架构原则和目标汇总成.

Java_Cappuccino的博客 2202

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

迟来的四月java面经分享,七面收割五个offer,大厂也不过如此!

都说金三银四是找工作的最佳时节,由于本人的个人职业规划跟目前工作内容不太相符(具体原因就不透露了,领导平时也要来这里逛,哈哈),四月份挑选了10多家公司投递简历(公司规模从几十人到上万人都有),参加了7家公司的电话面试,收获了5个offer,也还算不错。下面就分享一下面试过程中一些基础的,又最常见的问题。不啰嗦了,直接看题。 1. synchronized你用过吗?synchronized和Loc...

Java_Cappuccino的博客 2045

java开发者必知必会的50个Redis知识点,面试/学习都无所畏惧

Redis作为目前的主流NoSql数据库,不会是不可能的,在面试中也是非常高频的,一定不能在这个环节丢分,不管是学习,还是面试,以下知识点,都有必要掌握。 1.Redis是什么? Redis是一个开放源代码(BSD许可)的内存中数据结构存储,可用作数据库,缓存和消息代理,是一个基于键值对的NoSQl数据库。 2.Redis特性? 速度快 基于键值对的数据结构服务器 丰富的功能、丰富的数据结构 简单稳定 客户端语言多 持久化 主从复制 高可以 & 分布式 3.Redis合适的应用场景? 缓存 排

Java_Cappuccino的博客 1204

程序员职场小技巧:每天工作那么多事,如何安排事务的优先级?

最新互联网大厂面试真题、Java程序员面试策略(面试前的准备、面试中的技巧)请移步GitHub 我们在日常工作中,总会这样感慨:事情,是干不完的。既然干不完,那我们就要分清轻重缓急,哪个重要,哪个不重要,给它们划分一个优先级,这样不至于让自己手忙脚乱。 能给手头的事情排上正确的优先级,是一项很重要的工作能力。 当然,我们在生活和学习中,事情也可能不少。但是和工作中的优先级相比,生活和学习里的事情是我们自己的事情,只要安排得让我们自己满意就可以了。在工作中,事情的优先级的标准,是要让公司受益,让老板满意,让

Java_Cappuccino的博客 1161

还搞不清楚JVM是怎么处理异常的?这水平,跳槽都没人要

本文已收录GitHub,更有互联网大厂面试真题,面试攻略,高效学习资料等 文章目录异常的基本概念Java虚拟机是如何捕获异常的?Java 7的Supressed异常以及语法糖总结与实践 众所周知,异常处理的两大组成要素是抛出异常和捕获异常。这两大要素共同实现程序控制流的非正常转移。 抛出异常可分为显式和隐式两种。显式抛异常的主体是应用程序,它指的是在程序中使用“throw”关键字,手动将异常实例抛出。 隐式抛异常的主体则是 Java 虚拟机,它指的是 Java 虚拟机在执行过程中,碰到无法继续执行的异常.

Java_Cappuccino的博客 1049

不用怀疑!这就是把Java.I/O流讲解的最清楚的一篇文章

最新互联网大厂面试真题、Java程序员面试策略(面试前的准备、面试中的技巧)请访问GitHub 文章目录简单梳理理解File类简单梳理File操作递归遍历文件文件流:数据流的读写都是基于文件的操作FileInputStream:字节输入流FileOutputStream:字节输出流复制文件到指定位置FileReader:字符输入流FileWriter:字符输出流复制文件到指定位置(字符流只适合操作内容是字符文件)缓冲流:数据流的读写都是基于内存的操作BufferedInputStream:缓冲字节输入流Bu

Java_Cappuccino的博客 947

详解Linux系统安全:多人共用服务器,如何防止别人干“坏事”?

本文已收录GitHub,更有互联网大厂面试真题,面试攻略,高效学习资料等 本文就讨论一下 Linux 系统和应用安全。我们知道,在开发一个应用的过程中,需要涉及代码、操作系统、网络和数据库等多个方面。所以,只是了解代码安全肯定是不够的,我们还需要了解常见的基础环境和工具中的安全机制,学会通过正确地配置这些安全机制,来提升安全保障。 谈到 Linux,我相信你每天都在使用 Linux 进行各种开发和运维操作。但是,大多数情况下,公司不会给每一个员工分配专有的 Linux 服务器,而是多个开发和运维共用一台.

Java_Cappuccino的博客 928

美团 MySQL 数据库巡检系统的设计与应用

说明: 作者:王琦 来源:美团技术团队 最新互联网大厂面试真题、Java程序员面试策略(面试前的准备、面试中的技巧)请访问GitHub 我们生活中随处可见各种巡检系统,比如电力巡检、消防检查等,正是这些巡检工作,我们才能在稳定的环境下进行工作、生活。巡检对于数据库或者其他 IT 系统来说也同样至关重要,特别是在降低风险、提高服务稳定性方面起到了非常关键作用。 一、背景 为了保障数据库的稳定运行,以下核心功能组件必不可少: 其中,数据库巡检作为运维保障体系最重要的环节之一,能够帮助我们发现数据库存在的.

Java_Cappuccino的博客 924

面试字节跳动java岗被算法吊打,60天苦修这些笔记,侥幸收获offer

想要通关大厂面试,千万别让数据结构和算法拖了后腿 很多大公司,比如 BAT、Google、Facebook,面试的时候都喜欢考算法、让人现场写代 码。有些人虽然技术不错,但每次去面试都会“跪”在算法上,很是可惜。那你有没有想 过,为什么这些大公司都喜欢考算法呢? 这里给大家提三个问题: 业务开发工程师,你真的愿意做一辈子 CRUD boy 吗? 基础架构研发工程师,写出达到开源水平的框架才是你...

Java_Cappuccino的博客 860

Java程序员想要成功面试?请先要弄懂面试过程

本文已收录GitHub,更有互联网大厂面试真题,面试攻略,高效学习资料等 面试看能力,上场之前能够了解全局,熟悉细节,才能更有针对性地做足准备,做到心中有数。如果你已经参加过很多次面试了,请想一想,你真的清楚整个招聘过程吗?在你知道的那些环节背后,有什么人在主导,目的是什么,要注意什么,该做什么,不该做什么,以及有什么风险,这些问题你清不清楚呢? 今天,我从这些年的经验出发,从一个招聘职位出现,到招聘结束,给你讲讲整个过程都发生了什么、要注意什么。希望你透过面试官的视角,增加认知、充分准备、减少失误,为.

Java_Cappuccino的博客 803
上一篇: 为什么查询数据不多,却慢的离谱,在我请教了隔壁新来的阿里大佬后
下一篇: 为什么现在BAT面试必问分布式?阿里大牛带你实战剖析分布式锁
Java_Cappuccino
博客等级 码龄7年 17粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值