Kamafeel

求其上,得其中;求其中,得其下,求其下,必败


  • 首页

  • 归档

Tomcat-jar加载失败

发表于 2020-03-24 | 更新于 2022-03-23 | 分类于 中间件 , tomcat

居然有jar是坏的,明白吗?

linux:

for j in $(find /path/to/lib -name ‘*.jar’); do jar -tvf $j > /dev/null 2>&1; [ “$?” -ne 0 ] && echo “$j jar is broken”; done

windows:

header

hadoop-basics

发表于 2020-03-18 | 更新于 2021-08-02 | 分类于 大数据 , hadoop

hadoop-basics
http://blog.ditullio.fr/category/hadoop-basics/

JVM参数调优

发表于 2019-11-26 | 更新于 2022-03-08 | 分类于 JVM , 参数

-XX:+AlwaysPreTouch

JVM就会先访问所有分配给它的内存,让操作系统把内存真正的分配给JVM.后续JVM就可以顺畅的访问内存了

-XX:AutoBoxCacheMax=20000

JAVA进程启动的时候,会加载rt.jar这个核心包的,rt.jar包里的Integer自然也是被加载到JVM中,Integer里面有一个IntegerCache缓存

-Xss去调整JVM栈的大小

调整栈的深度,注意递归经常会超过默认深度

-Djava.security.egd=file:/dev/./urandom

随机数导致启动慢

常用参数参考

1
2
3
4
5

java -Duser.timezone=GMT+8 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6008 -Xmx2048m -XX:ParallelGCThreads=4 -XX:Conc
GCThreads=4 -Djava.util.concurrent.ForkJoinPool.common.parallelism=4 -XX:CICompilerCount=3 -XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -XX:MinHeapFreeRatio=20 -XX:
MaxHeapFreeRatio=40 -XX:+ExitOnOutOfMemoryError -cp . -jar **.jar

tomcat JVM 调优

发表于 2019-11-26 | 更新于 2022-03-23 | 分类于 中间件 , tomcat

如果是启动命令,则设置jvm 监控端口

if [ $1 = start ] ; then

# 设置内存,最大2048M
JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms6144m -Xmx6144m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m";

# 设置jmx 是否通过ssl 连接
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"

# 设置rmi 远程连接ip 地址
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=10.115.88.125"

# 设置jmx 远程连接端口号
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=7777"

# 设置jmx 远程连接是否需要用户认证,即用户名和密码
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"

fi

布隆过滤器

发表于 2019-09-19 | 更新于 2021-11-18 | 分类于 架构 , 算法

什么是布隆过滤器

本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。

相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。

header

header

计数删除

目前我们知道布隆过滤器可以支持 add 和 isExist 操作,那么 delete 操作可以么,答案是不可以,例如上图中的 bit 位 4 被两个值共同覆盖的话,一旦你删除其中一个值例如 “tencent” 而将其置位 0,那么下次判断另一个值例如 “baidu” 是否存在的话,会直接返回 false,而实际上你并没有删除它。

如何解决这个问题,答案是计数删除。但是计数删除需要存储一个数值,而不是原先的 bit 位,会增大占用的内存大小。这样的话,增加一个值就是将对应索引槽上存储的值加一,删除则是减一,判断是否存在则是看值是否大于0。

bf超量

一是存储原始数据,当 bf 超过 1000 个元素后生成一个 2000 个元素的 bf,另一种是堆叠 bf (叫做 scalable bloomfilter),超过 1000 个元素后再生成一个新的 1000 容量的 bf,查询的时候查多个

BitSet

public void test(){
BitSet set = new BitSet(10); //10 bits set

//set() 设为true
set.set(0);
set.set(1);
set.set(5);
System.out.println(set); // 应该是列出值为true的那些位的坐标!

// 8 bit >> 1 byte,  就是说截取8位,转成byte。 就是0010 0011 >>
System.out.println(Arrays.toString(set.toByteArray()));
// 64 bit >> 1 long
System.out.println(Arrays.toString(set.toLongArray()));
}

生成随机数0~1亿范围按照大小排序
HashSet? 4B*100000000 ≈ 381 MB
new BitSet(100000000),内存不过是 100000000/8 B ≈ 12 MB! 每得到一个随机数,就将相应的位设为true即可,bs.set(num)

防刷,限流

发表于 2019-09-19 | 更新于 2020-09-16 | 分类于 中间件 , Redis

OpenResty,lua脚本 redis

防刷代码lua
`– access_by_lua_file ‘/opt/ops/lua/access_limit.lua’

local function close_redis(red)
    if not red then
        return
    end
    --释放连接(连接池实现)
    local pool_max_idle_time = 10000 --毫秒
    local pool_size = 100 --连接池大小
    local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)

    if not ok then
        ngx_log(ngx_ERR, "set redis keepalive error : ", err)
    end
end


local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000)
local ip = "redis-ip"
local port = redis-port
local ok, err = red:connect(ip,port)
if not ok then
    return close_redis(red)
end

local clientIP = ngx.req.get_headers()["X-Real-IP"]
if clientIP == nil then
   clientIP = ngx.req.get_headers()["x_forwarded_for"]
end
if clientIP == nil then
   clientIP = ngx.var.remote_addr
end

local incrKey = "user:"..clientIP..":freq"
local blockKey = "user:"..clientIP..":block"

local is_block,err = red:get(blockKey) -- check if ip is blocked
if tonumber(is_block) == 1 then
   ngx.exit(ngx.HTTP_FORBIDDEN)
   return close_redis(red)
end

res, err = red:incr(incrKey)

if res == 1 then
   res, err = red:expire(incrKey,1)
end

if res > 200 then
    res, err = red:set(blockKey,1)
    res, err = red:expire(blockKey,600)
end

close_redis(red)

限流代码-lua
`– access_by_lua_file ‘/opt/ops/lua/access_flow_control.lua’

local function close_redis(red)
    if not red then
        return
    end
    --释放连接(连接池实现)
    local pool_max_idle_time = 10000 --毫秒
    local pool_size = 100 --连接池大小
    local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)

    if not ok then
        ngx_log(ngx_ERR, "set redis keepalive error : ", err)
    end
end

local function wait()
   ngx.sleep(1)
end

local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000)
local ip = "redis-ip"
local port = redis-port
local ok, err = red:connect(ip,port)
if not ok then
    return close_redis(red)
end

local uri = ngx.var.uri -- 获取当前请求的uri
local uriKey = "req:uri:"..uri
res, err = red:eval("local res, err = redis.call('incr',KEYS[1]) if res == 1 then local resexpire, err = redis.call('expire',KEYS[1],KEYS[2]) end return (res)",2,uriKey,1)
while (res 10)
do 
   local twait, err = ngx.thread.spawn(wait)
   ok, threadres = ngx.thread.wait(twait)
   if not ok then
      ngx_log(ngx_ERR, "wait sleep error: ", err)
      break;
   end
   res, err = red:eval("local res, err = redis.call('incr',KEYS[1]) if res == 1 then local resexpire, err = redis.call('expire',KEYS[1],KEYS[2]) end return (res)",2,uriKey,1)
end
close_redis(red)

lua in redis

发表于 2019-09-18 | 更新于 2020-10-26 | 分类于 中间件 , Redis

https://redisbook.readthedocs.io/en/latest/feature/scripting.html

JVM软引用的回收机制

发表于 2019-09-18 | 更新于 2020-09-19 | 分类于 JVM , 调优

-XX:SoftRefLRUPolicyMSPerMB=0

可以设置个1000,2000,3000,或者5000毫秒,都可以。

提高这个数值,就是让反射过程中JVM自动创建的软引用的一些类的Class对象不要被随便回收

基本上Metaspace区域的内存占用是稳定的,不会来回大幅度波动了

特别注意,运用到反射方式的代码调用。

tomcat错误日志

发表于 2019-09-02 | 更新于 2022-03-23 | 分类于 中间件 , tomcat

增加java.util.logging.ConsoleHandler配置

header

linux内存分配

发表于 2019-08-28 | 更新于 2021-08-02 | 分类于 linux

glibc 64M,发现glibc从2.11开始对每个线程引入内存池(64位机器大小就是64M内存)

header

1…192021

Kamafeel

204 日志
57 分类
129 标签
© 2022 Kamafeel
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Pisces v7.1.2