ThreadLocal 内存泄漏避免

ThreadLocal的原理是操作Thread内部的一个ThreadLocalMap,这个Map的Entry继承了WeakReference,设值完成后map中是(WeakReference,value)这样的数据结构。java中的弱引用在内存不足的时候会被回收掉,回收之后变成(null,value)的形式,key被收回掉了。
如果线程执行完之后销毁,value也会被回收,这样也没问题。但如果是在线程池中,线程执行完后不被回收,而是返回线程池中,Thread有个强引用指向ThreadLocalMap,ThreadLocalMap有强引用指向Entry,导致value无法被回收,一直存在内存中。在执行了ThreadLocal.set()方法之后一定要记得使用ThreadLocal.remove(),将不要的数据移除掉,避免内存泄漏。通过分析源码,java也做了一定优化,即使出现了上述的(null,value)情况,再调用一次ThreadLocal.set()也可以将这个废弃的替代调用。

2020/2/19 源自  Java

GreenPlum 安装实战

1、
cat /dev/null > /etc/sysctl.conf
sudo bash -c 'cat >> /etc/sysctl.conf <<-EOF
kernel.shmmax = 500000000
kernel.shmmni = 4096
kernel.shmall = 4000000000
kernel.sem = 500 1024000 200 4096
kernel.sysrq = 1
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.msgmni = 2048
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_forward = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.conf.all.arp_filter = 1
net.ipv4.ip_local_port_range = 1025 65535
net.core.netdev_max_backlog = 10000
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
vm.overcommit_memory = 2

EOF'

2、
cat /dev/null > /etc/security/limits.conf
sudo bash -c 'cat >> /etc/security/limits.conf <<-EOF

  • soft nofile 65536
  • hard nofile 65536
  • soft nproc 131072
  • hard nproc 131072

EOF'

3、
sudo bash -c 'cat >> /etc/ld.so.conf <<-EOF
/usr/local/lib

EOF'

4、
sudo yum install -y epel-release
sudo yum install -y \
apr-devel \
bison \
bzip2-devel \
cmake3 \
flex \
gcc \
gcc-c++ \
krb5-devel \
libcurl-devel \
libevent-devel \
libkadm5 \
libyaml-devel \
libxml2-devel \
libzstd-devel \
openssl-devel \
perl-ExtUtils-Embed \
python-devel \
python-pip \
readline-devel \
xerces-c-devel \
zlib-devel

pip install --upgrade setuptools
pip install --upgrade pip
pip install setuptools==40.6.3
sudo pip install conan
sudo pip install -r python-dependencies.txt
sudo pip install -r python-developer-dependencies.txt

5、
hostnamectl --static set-hostname mdw
hostnamectl --static set-hostname sdw1
hostnamectl --static set-hostname sdw2

wget https://codeload.github.com/greenplum-db/gporca/zip/v3.42.0 -O gporca-3.42.0.zip
unzip gporca-3.42.0.zip
cd gporca-3.42.0
source /etc/profile && cmake -GNinja -H. -Bbuild && ninja install -C build
ldconfig

cd /home/gpadmin
git clone https://github.com/greenplum-db/gpdb.git && cd gpdb

./configure --prefix=/data/app/gpdb --enable-orca \
--enable-gpperfmon \
--with-perl --with-python --with-libxml \
--enable-mapreduce \
--with-includes=/usr/local/include/ \
--with-libraries=/usr/local/lib \
--enable-thread-safety-force

make -j 32 && make install

source /data/app/gpdb/greenplum_path.sh

cd /data/gpdata && mkdir segmentdata1 masterdata segmentmirror1 segmentmirror

chown -R gpadmin:gpadmin /data /home/gpadmin

2019/5/24 源自  GreenPlum

GreenPlum 使用

使用 gpadmin 权限登录

psql -d GP -U gpadmin -h 127.0.0.1 -p 2345
阅读原文   2019/5/23 源自  GreenPlum

Kafka 是怎么工作的

Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用。目前越来越多的开源分布式处理系统如Cloudera、Apache Storm、Spark都支持与Kafka集成。

阅读原文   2018/9/13 源自  CentOS

mysql 存储过程和函数的实例运用

前言

在日常工作中总会使用一些存储过程或者函数简化代码逻辑。以下就是用户在系统注册的时候,为每个用户分配一个递增的UID为唯一标识,来记录用户的所有行踪。

阅读原文   2018/8/31 源自  MySQL

CentOS 安装 Storm 集群

阅读原文   2018/8/31 源自  CentOS

一键 shadowsocket 安装

使用root用户登录,运行以下命令:

wget --no-check-certificate -O shadowsocks-libev.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev.sh
chmod +x shadowsocks-libev.sh
./shadowsocks-libev.sh 2>&1 | tee shadowsocks-libev.log
阅读原文   2018/8/27 源自  CentOS

macOS 自用的命令集合

安装 elasticsearch

# 更新 brew
$ brew update
# 修改formula
$ cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula
$ git checkout 5874ac8c8fab69f8a714d643581e489bcb176d92 elasticsearch@5.6.rb
# 安装
$ brew install elasticsearch@5.6
# 查看
$ brew info elasticsearch@5.6
# 锁定版本, 防止被误升级
$ brew pin elasticsearch@5.6
# 安装ik
$ cd /usr/local/Cellar/elasticsearch@5.6/5.6.4
$ bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.6.4/elasticsearch-analysis-ik-5.6.4.zip
阅读原文   2018/8/21 源自  macOS

HashMap 理解

  • 请说一下 HashMap 的原理
    HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。

  • 依赖注入的好处和控制反转的理解
    依赖注入的好处:组件解耦,各个组件方便单元测试。各个组件无直接关系,但是可以组装工作。
    控制反转:顾名思义,主动变为被动的处理。

2018/8/20 源自  Java

macOS 安装 Kafka

1、kafka的安装

brew install kafka
brew switch kafka 1.1.0

安装会依赖zookeeper。
注意:安装目录:/usr/local/Cellar/kafka/0.10.2.0

阅读原文   2018/8/17 源自  macOS

Eclipse 无法更改 Dynamic Web Module 解决方案 Cannot change version of project facet Dynamic Web Module to 3.0 Error in Eclipse

阅读原文   2018/8/17 源自  Java

ActiveMQ 集群部署

一、安装jdk

二、安装zookeeper集群

阅读原文   2018/8/17 源自  CentOS

groovy 在使用 == 和 = 过程中遇到的坑

因为 groovy 天生就是支持 java 的脚本语言,所以在 java 中需要进行扩展业务的时候,得心应手,我们团队的台柱子也是这么认为的,并且把 groovy 与 java 代码结合的天衣无缝。

但是世事难料,在经过长达半年之久的运行测试,终于发现一个隐藏的两个亿 bug ,我们来回顾一下 bug 的产生。

阅读原文   2018/7/31 源自  Groovy

JAVA8 中 LocalDateTime 任意时间组合匹配当前时间 now() 触发条件

LocalDateTime 是 jdk8 新添加的 API,改变了以往 java.util.Date 的弊端,进行对年月日、时分秒进行重构,不仅 API 看着更直观,使用起来也更方便。

jdk8 以前的版本 java.util.Date 和 SimpleDateFormat 是非线程安全的,我们再使用的过程中,一般会配合 ThreadLocal 使用,保证在并发环境中,时间戳不会被其他线程篡改。LocalDateTime 天生就是线程安全的,并且时间戳一旦初始化,就不能进行更改,从根本上保证了多线程并发的支持。

阅读原文   2018/8/3 源自  Java

分享自己在 csp 中一键进行部署、调试、查看日志等操作的脚本

csp 调试中编译然后部署,耗费的时间比较长,在以往工作中,积累出自己编写的一个脚本工具,现在基本满足大部分需求,分享给大家使用。
脚本保存为 debugTool.sh 可执行 debugTool.sh -h 查看使用指南。
使用前需要将初始化变量设置为自己本地环境的路径。
脚本中使用 sshpass 作为免密钥远程登录命令工具,需要提前安装。

阅读原文   2018/8/14 源自  CentOS