活点地图
活点地图

活点地图

The Marauder's Map

文章整理

./AliMgrSockAgent -bd HRFUBkUMDlQPXhNUB14ZUAVSAAJSVkABQxRRRkQUCRRTRwwbLlYIUgEJCENeRh0XEUhGFFUWD1sWAFUDWF0eBAFWSFcBVhQVREBcEUcBE29dC0NBQBcAVgNIDxVdWQdCFBASDwFTVhs= -wd 777 -td maga
notion image
 
 
 
 
万字精美图文,带你掌握 JVM 内存布局及细节分析
本JVM系列属于本人学习过程当中总结的一些知识点,目的是想让读者更快地掌握JVM相关的知识要点,难免会有所侧重,若想要更加系统更加详细的学习JVM知识,还是需要去阅读专业的书籍和文档。 本文主题内容: 注:请 区分 JVM内存结构(内存布局) 和 JMM(Java内存模型)这两个不同的概念! 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM 内存布局规定了 Java 在运行过程中内存申请、分配、管理的策略 ,保证了 JVM 的高效稳定运行。 上图描述了当前比较经典的Java内存布局。(堆区画小了2333,按理来说应该是最大的区域) 如果按照线程是否共享来分类的话,如下图所示: PS:线程是否共享这点,实际上理解了每块区域的实际用处之后,就很自然而然的就记住了。不需要死记硬背。 下面让我们来了解下各个区域。 我们先来说堆。堆是 OOM故障最主要的发生区域。它是内存区域中最大的一块区域,被所有 线程共享,存储着 几乎所有的实例对象、数组。 所有的对象实例以及数组都要在堆上分配,但是随着JIT编译器的发展与 逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化发生, 所有的对象都分配在堆上也渐渐变得不是那么"绝对"了 。 延伸知识点:JIT编译优化中的一部分内容 - 逃逸分析 。 推荐阅读:深入理解Java中的逃逸分析 Java堆是垃圾收集器管理的主要区域,因此 很多时候也被称做"GC堆"。从内存回收的角度来看,由于现在收集器基本都采用分代收集算法,所以Java堆中还可以细分为: 新生代和老年代。再细致一点的有 Eden空间、From Survivor空间、To Survivor空间 等。从内存分配的角度来看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)。不过无论如何划分,都与存放内容无关,无论哪个区域,存储的都仍然是对象实例,进一步划分的目的是为了更好地回收内存,或者更快地分配内存。 根据Java虚拟机规范的规定, Java堆可以处于物理上不连续的内存空间中 ,只要逻辑上是连续的即可,就像我们的磁盘空间一样。在实现时,既可以实现成固定大小的,也可以在运行时动态地调整。 如何调整呢? 值得注意的是,在通常情况下,服务器在运行过程中,堆空间不断地扩容与回缩,会形成不必要的系统压力 所以在线上生产环境中 JVM的 Xms 和 Xmx 会设置成同样大小,避免在GC 后调整堆大小时带来的额外压力。 另外,再强调一下堆空间内存分配的大体情况。 这里可能就会有人来问了,你从哪里知道的呢?如果我想配置这个比例,要怎么修改呢? 我先来告诉你怎么看虚拟机的默认配置。命令行上执行如下命令,就可以查看当前JDK版本所有默认的JVM参数。 输出 对应的输出应该有几百行,我们这里去看和堆内存分配相关的两个参数 参数解释 因为新生代是由Eden + S0 + S1组成的,所以按照上述默认比例,如果eden区内存大小是40M,那么两个survivor区就是5M,整个young区就是50M,然后可以算出Old区内存大小是100M,堆区总大小就是150M。 输出 -XX:+HeapDumpOnOutOfMemoryError 可以让JVM在遇到OOM异常时,输出堆内信息,特别是对相隔数月才出现的OOM异常尤为重要。 看完上面对堆的介绍,我们趁热打铁再学习一下JVM创建一个新对象的内存分配流程。 绝大部分对象在Eden区生成,当Eden区装填满的时候,会触发 YoungGarbageCollection ,即 。垃圾回收的时候,在Eden区实现清除策略,没有被引用的对象则直接回收。依然存活的对象会被移送到Survivor区。Survivor区分为so和s1两块内存空间。每次 的时候,它们将存活的对象复制到未使用的那块空间,然后将当前正在使用的空间完全清除,交换两块空间的使用状态。如果 要移送的对象大于Survivor区容量的上限,则直接移交给老年代。一个对象也不可能永远呆在新生代,就像人到了18岁就会成年一样,在JVM中 -XX:MaxTenuringThreshold 参数就是来配置一个对象从新生代晋升到老年代的阈值。默认值是 15 , 可以在Survivor区交换14次之后,晋升至老年代。 上述涉及到一部分垃圾回收的名词,不熟悉的读者可以查阅资料或者看下本系列的垃圾回收章节。 在 HotSpot JVM 中, 永久代( ≈ 方法区)中用于存放类和方法的元数据以及常量池 ,比如 和 ...
万字精美图文,带你掌握 JVM 内存布局及细节分析
 
 
 
 
Piping 是一个轻量级的开源文件传输工具,可自托管,支持使用 curl、wget 下载,可更广泛的在无浏览器的设备上使用。传输方式基于 HTTP/HTTPS,使用 Stream 流式传输,可传输任何数据,比如屏幕共享、远程桌面、共享绘画、文字聊天等内容,也无大小限制。开发者曾测试不间断用 64 天传输了 1PB 文件。 http://t.cn/A6xUOVMy
 
一个字节员工开源的抠图工具
 
深分页问题
MySQL分页优化中的"INNER JOIN方式优化分页算法"到底在什么情况下会生效? - MSSQL123 - 博客园
本文出处: http://www.cnblogs.com/wy123/p/7003157.html 最近无意间看到一个MySQL分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的方案,因为现实中很多情况都不是固定不变的,能总结出来通用性的做法或者说是规律,是要考虑非常多的场景的,同时,面对能够达到优化的方式要追究其原因,同样的做法,换了个场景,达不到优化效果的,还要追究其原因。个人对此场景在不用情况表示怀疑,然后自己测试了一把,果然发现一些问题,同时也证实了一些预期的想法。本文就MySQL分页优化,从最最简单的情况出发,来做一个简单的分析。 另:本文测试环境是最最低配置的云服务器,相对来说服务器硬件环境有限,不过对于不同的语句(写法)应该是"平等的" 20170916补充:  想想用脚趾头就能明白,  1,如果分页排序字段是聚集索引,完全没必要对索引分页再查询数据,因为索引就是数据本身。  2,如果是非聚集索引,先对索引分页,然后再利用索引去查询数据,先分页索引确实可以减少扫描的范围  3,如果经常按照2中的方式查询,也就是按照非聚集索引排序查询,那么为什么不在该列上建立聚集索引呢。 MySQL经典的分页"优化"做法 MySQL分页优化中,有一种经典的问题,在查询越"靠后"的数据越慢(取决于表上的索引类型,对于B树结构的索引,SQL Server中也一样)select * from t order by id limit m,n。 也即随着M的增大,查询同样多的数据,会越来越慢面对这一问题,于是就产生了一种经典的做法,类似于(或者变种)如下的写法就是先把分页范围内的id单独找出来,然后再跟基表做关联,最后查询出来所需要的数据select * from tinner join (select id from t order by id limit m,n)t1 on t1.id = t.id 这种做法是不是总是生效的,或者说是在什么情况下后者才能到达到优化的目的?有没有做了改写之后无效甚至变慢的情况? 与此同时,绝大多数查询都是有筛选条件的,如果有筛选条件的情况,sql语句就变成了select * from t where *** order by id limit m,n如果如法炮制,改写成类似select * from tinner join
MySQL分页优化中的"INNER JOIN方式优化分页算法"到底在什么情况下会生效? - MSSQL123 - 博客园
 
Go 翻墙网络练手项目
 
双探
 
 
爱思想, 文章偏社会学术, 看样子是北大搞的
 
一亩三分地
 

Puppeteer 和 Selenium WebDriver 误区

在搭建 SingleFile 时, 对文档中 puppeteer 指定 -browser-executable-path chrome 路径时存在误区, 以及之前 google-arts-crawler 时使用 webdriver 想当然认为 webdriver 和 puppeteer 都是用的 webdriver , 其实两者完全是两个分之, 折腾了很长时间, 特此记录.
 
notion image
 
DevTools Protocol 浏览器交互协议,, 高级语言程序通过封装好的 Selenium WebDriver 中间层驱动来和浏览器交互, Chrome / Chromium 内核 使用ChromeDriver , Firefox gecko 内核使用 geckodriver.
 
Puppeteer 则是有谷歌提供自家操作 DevTools Protocol 的工具, 只要安装 Chrome/ Chromium 即可操作,效率更高.
 
故两者是不同的东西, 不能混为一谈.
 
注意:逃逸分析和标量替换是栈上分配的前提,所以,在jvm参数中关闭了二者其中一个选项,栈上分配都不会生效。
 
 
JVM
 
 
Spring 状态机
 
中国人民大学国家发展和战略研究院一些报告文章, 挺有意义
 
人大研究, 涉及到政治文章
 
故事
 
计算机类电子书
 
听书,最近比较迷雪中悍刀行
 
好的 idea 💡, 想写一个微博历史快照记录功能, 可以利用我的 weibo-scraper 算是废物利用
 
论坛源码
 
搭建 Cloudflare 背后的 IPv6 AnyCast 网络
人一穷,鬼点子就特别多。 大家应该知道,本博客使用了 Cloudflare 作为主要的 CDN,可以配置一些 Page Rules 来减轻源站压力,同时 隐藏源站地址 啥的,此外,Cloudflare 还可以做到防止 DDoS 的效果。 我们知道,DDoS 作为一个比较 dirty 的攻击手段,从原理上其实并不是很好防御,基本只能通过升级硬件,加大带宽的方式处理,而 Cloudflare 处理 DDoS 的方式比较特别,部分原因是因为他们的边缘节点 IP 是 Anycast IP,这里可能有同学会问了,什么是 Anycast IP? 简单来说,就是同一个 IP 出现在了世界各地,世界各地的主机都是访问到了离自己最近(延迟最低)的主机所宣告的那个相同 IP。 在我们学习了计算机网络之后,我们知道了一个比较容易理解的道理:「IP 地址在互联网上是一台主机唯一的地址」,这样当我们「ping 美国一台主机的 IP」的时候,ICMP 包会通过路由协议,走各种线路,最终到达目的主机,而其中产生的网络延迟很大一部分就是由于距离所导致的,或者说,由于光速也就那样了,所以中美之间肯定会有 100+ms 的延迟,例如,从世界各地到达日本 Vultr 机房的延迟可能如下: 但是如果你是 Cloudflare 的客户的话,你可能会发现追踪到你站点的延迟如下: 是不是发现许多城市到达同一个 IP 的延迟都非常低?这个就是 Anycast 的魅力了,想要了解更多关于 Cloudflare Anycast 的细节,可以参考 A Brief Primer on Anycast 和 What is Anycast?
搭建 Cloudflare 背后的 IPv6 AnyCast 网络
 
从中科大镜像小站中获取 Proxmox VE 一枚来替换 VMware
 
fork bomb 释义
notion image
 
 
tcp 的半链接和全链接讲的很棒
TCP SYN队列与Accept队列详解
尽信书,不如无书。   纸上得来终觉浅,绝知此事要躬行。   实验现象依赖于系统(如下)以及内核参数(附录);一切以实验结果为准。 cat /proc/version Linux version 3.10.0-693.el7.x86_64   线上服务(Golang)调用内网API服务(经由内网网关/Nginx转发)时,偶尔会出现"connection reset by peer"报警;为此梳理TCP RST包可能产生的几种情况:   情况说明:Golang服务作为客户端,内网网关Nginx作为服务端,HTTP请求默认基于长连接(连接池)。   情况1非常容易理解;同机房内网环境,基本可以排除。这里不做过多介绍。下面将详细介绍情况2/3/4。   Golang服务通过长连接向网关Nginx发起请求;当Nginx主动断开连接,而恰好很不幸的此时Golang发起HTTP请求并且是复用之前的长连接,便会出现情况2。那么什么时候Nginx会主动断开长连接呢?   1)keepalive_timeout:设置每个TCP长连接在Nginx可以保持的最大时间,默认75秒;   2)keepalive_requests:设置每个TCP长连接最多可以处理的请求数,默认100;   Golang目前有这几个措施应对连接关闭情况:1)底层检测连接关闭事件,标记连接不可用;2)ECONNRESET错误时,对部分请求进行重试,比如:GET请求,请求头中出现{X-,}Idempotency-Key。当然实际判断是否重试逻辑还是比较复杂的; +Transport.roundTrip +persistConn.shouldRetryRequest +RequestisReplayable func (r *Request) isReplayable() bool { if r.Body == nil || r.Body == NoBody || r.GetBody != nil { switch valueOrDefault(r.Method, "GET") { case "GET", "HEAD", "OPTIONS", "TRACE":
TCP SYN队列与Accept队列详解
 
iptables 命令释义
iptables -I INPUT -d vpsip/32 -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,URG RST -j DROP

-I 插入规则
INPUT 表示进站
-d:匹配目标地址
-p:匹配协议 协议通常有3种,tcp/udp/icmp
-m multiport:表示启用多端口扩展
–tcp-flags TCP的几个状态标识SYN, FIN, ACK, PSH, RST, URG
SYN表示建立连接,
FIN表示关闭连接,
ACK表示响应,
PSH表示有 DATA数据传输,
RST表示连接重置。
URG(紧急,貌似实际应用只有前5)
-j ACTION
DROP:悄悄丢弃
一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表
REJECT:明示拒绝
ACCEPT:接受
custom_chain:转向一个自定义的链
DNAT
SNAT
MASQUERADE:源地址伪装
REDIRECT:重定向:主要用于实现端口重定向
MARK:打防火墙标记的
RETURN:返回
在自定义链执行完毕后使用返回,来返回原规则链。

参考链接:https://blog.chinaunix.net/uid-26495963-id-3279216.html
https://www.v2ex.com/t/324118#reply7 提到 以前搜索 gfw rst 时有人提到过,尝试了确实有一定的改善。感觉 ssh 稳定很多。有兴趣可以从其中关键词入手进行拓展。
 

 

一些书籍