`
blueswind8306
  • 浏览: 124607 次
  • 来自: ...
社区版块
存档分类
最新评论
文章列表
参考以下博客: 关于两种限流模式 其中,我理解的时间窗口的实现方式: 1. 建立一个定长数组,数组每个位置代表一个相对时间窗口,内容存储这个窗口内的限流计数器(AtomicInteger) 2. 保存一个初始索引指针,用来记录指针变更 3. 当请求过来时,先将当前时间取模定位到数组中的某个位置(代表某个相对时间),然后判断此位置是否等于索引指针,如果等于说明还在当前窗口内,则将它的值+1;如果不等于则说明不在当前窗口内了,则需要先将此位置的值覆盖为1,再将指针移动。 这里需要注意移动指针的并发操作问题。
通过GC日志简单分析是否存在内存泄露的脚本(前提是使用CMSGC方式进行内存回收,并且打开GCDetails开关),思路是取出每次CMSGC|FullGC后的第一次MinorGC后,老生代剩余内存大小(总剩余内存-新生代剩余),如果一直增加则肯定有内存泄露: grep -E -A1 "(CMS-concurrent-reset)|(Full GC)" gc.log |grep "\[ParNew" |awk '{print $6" "$9" "$1}' |awk -F'K' '{print substr($2,3 ...
某个OpenAPI应用在大并发量情况下,其中某个jsp总会堵在一个for循环的JspWriter.write处,通过jstack观察如下: 在测试环境下做同样用户日志的压测,奇怪的是并不能重现此问题,之后通过tcpflow定位到此接口调用方(调用方的User-Agent是一个公司内的客户端标识),但依然没有想到什么好的定位方法。 后来有一天,突然想到可以通过伴随压力测试先确认一下是否是网络通讯层的问题,伴随压力测试是用线上机器作为压测服务端,而压测客户端是和线上机器在同一内网的另一台机器。在增压后如果出问题的线程栈数量和增压数量没有成正比增加则可以证明是网络层的问题,压测发现果然如此。 接下来 ...
要做一个jar文件供外部调用,此jar的源代码中注释为中文,用maven打包后在其它工程中导入后总不能正常显示中文,记录解决方法如下: 在pom.xml中设置默认编码类型为UTF-8: 引用<project> ... <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> ... </project> 在pom.xml中设置编码类型: 引用<plugins> ... <plu ...
  我们在进行GC调优的过程中,经常是发现出现问题后(比如OOM或者应用长时间暂停),再进行调优的过程。能不能做到在问题出现之前,就先进行调优呢?让我们来给GC算算卦吧!   首先,我们需要拿到一些系统运行状况才能 ...
在学习GC机制时,发现有些东西通过普通的jvm参数是很难看到的,比如在ParallelGC触发悲观机制时,如果想看到此时新生代的平均晋升大小似乎就不可能的,发现在JDK源代码中有类似下面这样的if块: if (PrintGCDetails && Verbose) { gclog_or_tty->print(result ? " do scavenge: " : " skip scavenge: "); gclog_or_tty->print_cr(" average_promoted " SI ...
我们知道,CMSGC在老生代回收时产生的内存碎片会导致老生代的利用率变低;或者可能在老生代总内存大小足够的情况下,却不能容纳新生代的晋升行为(由于没有连续的内存空间可用),导致触发FullGC。针对这个问题,Sun官方给出了以下的四种解决方法: 增大Xmx或者减少Xmn 在应用访问量最低的时候,在程序中主动调用System.gc(),比如每天凌晨。 在应用启动并完成所有初始化工作后,主动调用System.gc(),它可以将初始化的数据压缩到一个单独的chunk中,以腾出更多的连续内存空间给新生代晋升使用。 降低-XX:CMSInitiatingOccupancyFraction参数以提早执行C ...
前期工作 统计应用数据(峰值TPS、平均TPS,每秒平均分配内存大小、每个请求的平均分配内存大小) 统计GC分配、回收内存的数据(MinorGC、FullGC停顿时长,平均多长时间触发一次GC,每次Eden->Old的平均晋升大小等) 搭建压力 ...
CumulativeProtocolDecoder.decode() 拿到IoSession中的ByteBuffer,如果有则设置usingSessionBuffer=true并且读取这个ByteBuffer;否则设置usingSessionBuffer=false,并且从网络流中读取ByteBuffer。 循环调用doDecode()方法进行解码,直到解码失败(doDecode返回false)或者解码成功并且刚好读取完当前的ByteBuffer。 如果还有没读取完的数据,则将数据拷贝到IoSession中的ByteBuffer头部;否则移除IoSession中的ByteBuffer,为下 ...
在以下两个环境下测试成功: 环境1:CentOS4.4 + jdk1.6.0_26 + jfreechart-1.0.13 + jcommon-1.0.16 环境2:CentOS4.8 + jdk1.6.0_14 + jfreechart-1.0.13 + jcommon-1.0.16 在$JAVA_HOME/jre/lib/fonts/目录下创建名为fallback的子目录 将simsum.zip中的字体文件拷贝到此目录下 在jfreechart调用代码中添加如下方法,并调用此方法来设置字体: private void setChartFont(JFreeChart jfreechart) ...
在一个爬虫程序中遇到了以下异常:java.net.SocketException No buffer space available (maximum connections reached?): JVM_Bind 我们知道,操作系统有它允许持有的最大文件句柄数,而在网络连接的过程中,每个socket请求都要占用一个文件句柄资源,如果没有及时释放,则可能会耗尽文件句柄资源.通过检查代码,发现在使用HttpClient发送Get请求时没有释放资源,并且由于是多线程程序,很容易耗尽资源改写后的代码如下: java 代码 HttpClient client = new HttpClient ...
Global site tag (gtag.js) - Google Analytics