java
最新文章Jvm垃圾回收机制
Java有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。
概述垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物。事实上,GC的历史比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。当Lisp还在胚胎时期时,人们就在思考GC需要完成的3件事情:
哪些内存需要回收(简而言之,什么是垃圾(Garbage))?
什么时候回收?
如何回收?
经过半个多世纪的发展,目前内存的动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,那为什么我们还要去了解GC和内存分配呢?答案很简单:当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。
需要回收的内存(Garbage)在堆里面存放着Java程序中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(即不可能再被任何途径使用的对象), 这个对象就 ...
java
logstash-7.17.12启动失败解决方法
问题描述Logstach使用启动命令:
1logstash.bat -e "input { stdin { } } output { stdout {} }"
然后出现下面报错信息:
12345Using JAVA_HOME defined java: C:\Program Files\Java\jdk1.8.0_333WARNING: Using JAVA_HOME while Logstash distribution comes with a bundled JDK.DEPRECATION: The use of JAVA_HOME is now deprecated and will be removed starting from 8.0. Please configure LS_JAVA_HOME instead.系统找不到指定的路径。could not find java; set JAVA_HOME or ensure java is in PATH
Logstach ...
网络
键入网址到网页显示过程
HTTP
浏览器做的第一步工作是解析 URL首先浏览器做的第一步工作就是要对 URL 进行解析,从而生成发送给 Web 服务器的请求信息。
URL的结构如下图所示:
当省略数据源路径名时,就代表访问根目录下事先设置的默认文件,也就是 /index.html 或者 /default.html 这些文件
对 URL 进行解析之后,浏览器就确定了 Web 服务器和文件名,接下来就是根据这些信息来生成 HTTP 请求消息。
浏览器做的第二步工作是真实地址查询 (DNS)通过浏览器解析 URL 并生成 HTTP 请求消息后,需要委托操作系统将消息发送给 Web 服务器。
但在发送之前,需要先查询服务器域名对应的 IP 地址,因为委托操作系统发送消息时,必须提供通信对象的 IP 地址。而DNS服务器
就是一种专门保存了Web 服务器域名与 IP 的对应关系的服务器。
域名的层级关系
DNS 中的域名都是用点来分隔的,比如 www.server.com,这里的句点代表了不同层次之间的界限。在域名中,越靠右的位置表示其层级越高。实际上域名最后还有一个点,比如 www.server.com., ...
java
Redis持久化-RDB快照
前言Redis的AOF日志记录的操作命令,而非实际数据,恢复数据时需要把日志全量执行一遍;所以当AOF日志足够大时,必然造成Redis数据恢复缓慢。Redis为解决这个问题,故而增加了RDB快照。RDB快照记录的是某一瞬间的内存数据(实际数据),因此在数据恢复时,RDB快照恢复数据比AOF的效率高些,因为RDB只需将数据读入内存即可,不需要想AOF那样还需要额外执行命令才能恢复数据。
RDB持久化RDB快照进行时会阻塞线程吗?
Redis 提供了两个命令来生成 RDB 文件,分别是 save 和 bgsave,他们的区别就在于是否在「主线程」里执行:
执行了 save 命令,就会在主线程生成 RDB 文件,由于和执行操作命令在同一个线程,所以如果写入 RDB 文件的时间太长,会阻塞主线程;
执行了 bgsave 命令,会创建一个子进程来生成 RDB 文件,这样可以避免主线程的阻塞;
Redis 还可以通过配置文件的选项来实现每隔一段时间自动执行一次 bgsave 命令,默认会提供以下配置:
123save 900 1save 300 10save 60 10000
虽然命令选 ...
java
Redis持久化-AOF日志
Redis持久化
Redis 的读写操作都是在内存中,所以 Redis 的性能高,但是当 Redis 重启或宕机后,内存中的数据就会丢失,为了保证内存中的数据不会丢失,故Redis 采用了数据持久化的机制,这个机制会把数据存储到磁盘,这样在 Redis 重启后就能够从磁盘中恢复原有的数据。
Redis持久化的三种方式:
AOF日志:Redis每执行一次操作命令,就把该命令以追加的方式写入磁盘相应的文件中
RDB快照:将某一时刻的内存数据,以二进制的方式写入磁盘
混合持久化方式:Redis 4.0新增的持久化方式,集成了AOF与RDB的优点
AOF日志实现Redis每执行一次操作命令,就把该命令以追加的方式写入磁盘相应的文件中,在Redis重启后,就从磁盘读取对应AOF文件记录的命令,然后逐一执行来进行数据恢复;这就存在一个问题,当AOF日志很大的时候,数据恢复就会很慢,且其操作模式会对Redis的性能有所损耗。
AOF日志为什么先执行命令,再把数据写入日志呢?
Redis的AOF日志先执行后写入,主要基于以下考虑:
与MySQL和其他数据库的事务机制相比,Redis事务可 ...
java
Redis基础(笔记一)
什么是Redis?
Redis是一种基于内存的NoSQL数据库,对数据的读写都在内存中完成,因此读写的速度非常快,Redis常用于缓存、消息队列、分布式锁等场景。
Redis支持多种数据类型,如String(字符串)、Hash(哈希)、List(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、HyperLogLog(基数统计)、GEO(地理信息)、Stream(流)等。并且Redis对数据的操作都是原子性的,采用单线程执行命令,不存在并发的问题。除此之外,Redis 还支持事务 、持久化、Lua 脚本、多种集群方案(主从复制模式、哨兵模式、切片机群模式)、发布/订阅模式,内存淘汰机制、过期删除机制等
Redis 和 Memcached 有什么区别?Redis 和 Memcached都是基于内存的数据库,一般都当作缓存使用、都有过期策略且两者的性能都非常高。那为什么我们一般都选择Redis做数据缓存呢?
Redis 支持的数据类型更丰富(String、Hash、List、Set、ZSet),而 Memcached 只支持最简单的 key-value 数 ...