Java中的常见OOM及原因

Java中的OOM(Out of Memory)指java.lang.OutOfMemoryError错误。了解JVM的基本原理后,很容易理解以下几种常见的OOM。 java.lang.OutOfMemoryError:Java heap space 这是最常见的OOM原因。 堆中主要存放各种对象实例,还有常量池等结构。当JVM发现堆中没有足够的空间分配给新对象时,抛出该异常。具体来讲,在刚发现空间不足时,会先进行一次Full GC,如果GC后还是空间不足,再抛出异常。 引起空间不足的原因主要有: 业务高峰,创建对象过多 内存泄露 内存碎片严重,无法分配给大对象 java.lang.OutOfMemoryError:Metaspace 方法区主要存储类的元信息,实现在元数据区。当JVM发现元数据区没有足够的空间分配给加载的类时,抛出该异常。 引起元数据区空间不足的原因主要有: 加载的类太多,常见于Tomcat等容器中 但是元数据区被实现在堆外,主要受到进程本身的内存限制,这种实现下很难溢出。 java.lang.OutOfMemoryError:Permgen space jdk7中,方法区被实现在永久代中,错误原因同上。 永久代非常小,而且不会被回收,很容易溢出,因此,jdk8彻底废除了永久代,将方法区实现在元数据区。 java.lang.OutOfMemoryError:Unable to create new native thread 以Linux系统为例,JVM创建的线程与操作系统中的线程一一对应,受到以下限制: 进程和操作系统的内存资源限制。其中,一个JVM线程至少要占用OS的线程栈+JVM的虚拟机栈 = 8MB + 1MB = 9MB(当然JVM实现可以选择不使用这1MB的JVM虚拟机栈)。 进程和操作系统的线程数限制。 Linux中的线程被实现为轻量级进程,因此,还受到pid数量的限制。 当无法在操作系统中继续创建线程时,抛出上述异常。 解决办法从原因中找: 内存资源:调小OS的线程栈、JVM的虚拟机栈。 线程数:增大线程数限制。 pid:增大pid范围。 其他异常 java.lang.OutOfMemoryError:GC overhead limit exceeded 默认配置下,如果GC花费了98%的时间,回收的内存都不足2%的话,抛出该异常。 java.lang.OutOfMemoryError:Out of swap space 如果JVM申请的内存大于可用物理内存,操作系统会将内存中的数据交换到磁盘上去(交换区)。如果交换区空间不足,抛出该异常。

2021-12-10 · 1 分钟

使用宝塔面板将Hexo部署到腾讯轻量级应用服务器

一、安装宝塔面板 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 安装成功后,显示如下内容 外网面板地址: http://xx:8888/xx 内网面板地址: http://10.0.16.13:8888/xx username: xx password: xx If you cannot access the panel, release the following panel port [8888] in the security group 若无法访问面板,请检查防火墙/安全组是否有放行面板[8888]端口 在宝塔面板网站管理中,添加站点(第一次进入需要安装nginx,点击快速安装即可) 二、Git仓库创建 1、服务端增加git用户 adduser git passwd git 2、给git用户授权 vim /etc/sudoers #在root ALL=(ALL) ALL 下方添加一行 git ALL=(ALL) ALL 3、用户端跟服务端做免密登录 用户端生成密钥对 ssh-keygen 将秘钥传到服务端 ssh-copy-id git@server_ip # 输入git刚创建的git用户的密码 验证 ssh git@server_ip # 如果没有要求输入密码就登录进去了 说明免密成功 4、创建git仓库...

2021-12-09 · 1 分钟

OpenVPN 设置账号密码登录

前面我们是使用openvpn 秘钥的方式登录,这种登录安全性比较高。但是运维操作起来比较麻烦,如果有ldap的也推荐使用ldap集成openvpn。但是这里我们偷个懒,通过设置账号密码的方式连接vpn 配置OpenVPN 首先我们需要编写一个用户认证的脚本 (脚本是由openvpn官网提供的) vim /etc/openvpn/checkpsw.sh #!/bin/sh ########################################################### # checkpsw.sh (C) 2004 Mathias Sundman # # This script will authenticate OpenVPN users against # a plain text file. The passfile should simply contain # one row per user with the username first followed by # one or more space(s) or tab(s) and then the password. PASSFILE="/etc/openvpn/psw-file" LOG_FILE="/etc/openvpn/openvpn-password.log" TIME_STAMP=`date "+%Y-%m-%d %T"` ########################################################### if [ ! -r "${PASSFILE}" ]; then echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading....

2021-12-08 · 2 分钟

centos7.4 安装mysql 5.7

以centos为例(以root身份登录) 目录约定 安装文件下载目录:/data/software mysql目录安装位置:/usr/local/mysql 数据库保存位置:/data/mysql 日志保存位置:/data/log/mysql #如果这3个文件夹不存在,先创建 mkdir -p /data/software mkdir -p /data/mysql mkdir -p /data/log/mysql #创建错误日志文件 cd /data/log/mysql touch error.log #/usr/local/mysql这个目录待会解压安装包的时候一并创建 下载并解压 在官网选择mysql5.7.24 Linux - Generic版本下载 文件较大推荐服务器使用wget命令下载,或者本地使用迅雷下载,然后上传到服务器 cd /data/software wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz tar -zxvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz #这里注意mysql后面没有/ mv mysql-5.7.24-linux-glibc2.12-x86_64 /usr/local/mysql 新建mysql组、用户 groupadd mysql #新建msyql用户禁止登录shell useradd -r -g mysql mysql -s /sbin/nologin #更改目录权限 chown -R mysql:mysql /usr/local/mysql chown -R mysql:mysql /data/log/mysql 配置参数 bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql bin/mysql_ssl_rsa_setup --datadir=/data/mysql cd /usr/local/mysql/support-files cp mysql....

2021-12-07 · 1 分钟

解决npm install下载chromedriver@2.46.0依赖包超级慢问题

一、问题出现原因 使用gitlab-runner部署前端js项目时,下载chromedriver@2.46.0有时候相当的慢。 主要原因是npm install老去国外github下载 > chromedriver@2.45.0 install /app/node_modules/chromedriver > node install.js Current existing ChromeDriver binary is unavailable, proceding with download and extraction. Downloading from file: https://chromedriver.storage.googleapis.com/2.45/chromedriver_linux64.zip Saving to file: /app/node_modules/chromedriver/chromedriver/chromedriver_linux64.zip ... 后来去放置gitlab-runner那台主机wget一下,结果一直响应中 cuiyf@gitlabrunner:~$ wget https://chromedriver.storage.googleapis.com/2.46/chromedriver_linux64.zip --2019-08-05 17:46:32-- https://chromedriver.storage.googleapis.com/2.46/chromedriver_linux64.zip Resolving chromedriver.storage.googleapis.com (chromedriver.storage.googleapis.com)... 216.58.200.48, 2404:6800:4008:801::2010 Connecting to chromedriver.storage.googleapis.com (chromedriver.storage.googleapis.com)|216.58.200.48|:443... connected. HTTP request sent, awaiting response... 二、解决思路 设法使其去淘宝镜像源地址下载 https://registry.npm.taobao.org/ 三、解决方案 由于我是用docker部署的,修改Dockerfile添加如下配置 npm install chromedriver --chromedriver_cdnurl=http://cdn.npm.taobao.org/dist/chromedriver FROMcuiyf/node:8.12.0-alpine as build-stageCOPY . /appWORKDIR/appRUN npm config set registry http://172....

2021-12-06 · 1 分钟

CentOS 7 搭建OpenVPN服务器

OpenVPN的工作原理 在Linux2.4版本以上,操作系统支持一个名为tun的设备,tun设备的驱动程序中包含两个部分,一部分是字符设备驱动,一部分是网卡驱动。网卡的驱动把从TCP/IP协议栈收到的数据包结构skb放于tun设备的读取队列,用户进程通过调用字符设备接口read获得完整的IP数据包,字符驱动read函数的功能是从设备的读取队列读取数据,将核心态的skb传递给用户;反过来字符驱动write函数给用户提供了把用户态的数据写入核心态的接口,write函数把用户数据写入核心空间并穿入TCP/IP协议栈。该设备既能以字符设备的方式被读写,作为系统的虚拟网卡,也具有和物理网卡相同的特点:能够配置IP地址和路由。对虚拟网卡的使用是OpenVPN实现其SSL VPN功能的关键。 OpenVPN服务器一般需要配置一个虚拟IP地址池和一个自用的静态虚拟IP地址(静态地址和地址池必须在同一个子网中),然后为每一个成功建立SSL连接的客户端动态分配一个虚拟IP地址池中未分配的地址。这样,物理网络中的客户端和OpenVPN服务器就连接成一个虚拟网络上的星型结构局域网,OpenVPN服务器成为每个客户端在虚拟网络上的网关。OpenVPN服务器同时提供对客户端虚拟网卡的路由管理。当客户端对OpenVPN服务器后端的应用服务器的任何访问时,数据包都会经过路由流经虚拟网卡,OpenVPN程序在虚拟网卡上截获数据IP报文,然后使用SSL协议将这些IP报文封装起来,再经过物理网卡发送出去。OpenVPN的服务器和客户端在虚拟网卡之上建立起一个虚拟的局域网络,这个虚拟的局域网对系统的用户来说是透明的。 OpenVPN的服务器和客户端支持tcp和udp两种连接方式,只需在服务端和客户端预先定义好使用的连接方式(tcp或udp)和端口号,客户端和服务端在这个连接的基础上进行SSL握手。连接过程包括SSL的握手以及虚拟网络上的管理信息,OpenVPN将虚拟网上的网段、地址、路由发送给客户端。连接成功后,客户端和服务端建立起SSL安全连接,客户端和服务端的数据都流入虚拟网卡做SSL的处理,再在tcp或udp的连接上从物理网卡发送出去 环境说明 192.168.0.10外网 10.4.82.10 内网 系统环境 [root@vpn ~]# cat /etc/redhat-release CentOS Linux release 7.7.1908 (Core) [root@vpn ~]# uname -r 3.10.0-1062.9.1.el7.x86_64 网卡为双网卡 [root@vpn ~]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.0.11 netmask 255.255.255.0 broadcast 192.168.0.255 inet6 fe80::6b5a:9ab8:1bb:5f8d prefixlen 64 scopeid 0x20 ether 00:0c:29:32:b2:36 txqueuelen 1000 (Ethernet) RX packets 15104 bytes 16993218 (16.2 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8661 bytes 889872 (869....

2021-12-05 · 5 分钟