您当前的位置:首页 > 电脑百科 > 站长技术 > 服务器

互联网云服务器JVM监控——JDK自带工具

时间:2021-03-12 12:16:45  来源:  作者:

背景

目前,有很多公司的WEB服务器会出现CPU、内存、IO告警,运维人员往往不能及时地获取JVM等相关信息,以便分析造成告警的原因,故本文将从几个方面来阐述如何进行JVM快照,如何分析dump的快照文件,以及Tomcat调优,JVM参数调优设置和程序代码书写需要注意的问题。

JVM学习

首先,我们来看一下JAVA中的内存模型:

互联网云服务器JVM监控——JDK自带工具

图 1

Dump JVM快照及分析

Java VisualVM工具

Jmap自动化获取快照

性能调优

Tomcat容器调优

这里以Tomcat7举例说明,Tomcat7容器调优主要是在server.xml文件中对connector进行调优,添加相关属性,实现高并发。

server.xml配置

<Connector port="8080"protocol="HTTP/1.1" maxThreads="30000"

minSpareThreads="512" maxSpareThreads="2048" enableLookups="false"

redirectPort="8443" acceptCount="35000" debug="0" connectionTimeout="40000"

disableUploadTimeout="true" URIEncoding="UTF-8" />

参数说明:

connectionTimeout

网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。

keepAliveTimeout

长连接最大保持时间(毫秒)。此处为15秒。

maxKeepAliveRequests

最大长连接个数(1表示禁用,-1表示不限制个数,默认100个。一般设置在100~200之间)

maxHttpHeaderSize

http 请求头信息的最大程度,超过此长度的部分不予处理。一般8K。

URIEncoding

指定Tomcat 容器的URL 编码格式。

acceptCount

指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认为10个。

disableUploadTimeout

上传时是否使用超时机制

enableLookups

是否反查域名,取值为:true 或false。为了提高处理能力,应设置为false

maxSpareThreads

最大空闲连接数,一旦创建的线程超过这个值,Tomcat 就会关闭不再需要的socket线程The default value is 50.

maxThreads

最多同时处理的连接数,Tomcat 使用线程来处理接收的每个请求。这个值表示Tomcat 可创建的最大的线程数。

minSpareThreads

最小空闲线程数,Tomcat 初始化时创建的线程数.

minProcessors

最小空闲连接线程数,用于提高系统处理性能,默认值为10。

maxProcessors

最大连接线程数,即:并发处理的最大请求数,默认值为75

JVM调优

程序开发注意事项

程序开发时,如果不理解JVM,很可能会造成内存溢出、栈溢出等问题。

堆溢出

public class HeapOOM {

 

static class OOMObject{}

/**

* @param args

*/

public static void main(String[] args) {

List<OOMObject> list = new ArrayList<OOMObject>();

 

while(true){

list.add(new OOMObject());

}

}

}

分析:

我们上面看到堆主要是存放对象的,所以我们如果想让堆出现OOM的话,可以开一个死循环,然后产生新的对象就可以了。然后再将堆的大小调小点。

加上JVM参数

-verbose:gc -Xms10M -Xmx10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+HeapDumpOnOutOfMemoryError,

就能很快报出OOM:

Exception in thread "main"
java.lang.OutOfMemoryError: Java heap space。

栈溢出

package com.cutesource;

 

public class StackOOM {

 

/**

* @param args

*/

 

private int stackLength = 1;

 

public void stackLeak(){

stackLength++;

stackLeak();

}

 

public static void main(String[] args) throws Throwable{

// TODO Auto-generated method stub

StackOOM oom = new StackOOM();

try{

oom.stackLeak();

}catch(Throwable err){

System.out.println("Stack length:" + oom.stackLength);

throw err;

}

}

}

分析:

我们知道栈中存放的方法执行的过程中需要的空间,所以我们可以下一个循环递归,这样方法栈就会出现OOM的异常了。

设置JVM参数:-Xss128k,报出异常:

Exception in thread "main" java.lang.StackOverflowError

打印出Stack length:1007,这里可以看出,在我的机器上128k的栈容量能承载深度为1007的方法调用。

方法区溢出

public class MethodAreaOOM {

 

static class OOMOjbect{}

 

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

while(true){

Enhancer eh = new Enhancer();

eh.setSuperclass(OOMOjbect.class);

eh.setUseCache(false);

eh.setCallback(new MethodInterceptor(){

 

@Override

public Object intercept(Object arg0, Method arg1,

Object[] arg2, MethodProxy arg3) throws Throwable {

// TODO Auto-generated method stub

return arg3.invokeSuper(arg0, arg2);

}

 

});

eh.create();

}

}

 

}

分析:

我们知道方法区是存放一些类的信息等,所以我们可以使用类加载无限循环加载class,这样就会出现方法区的OOM异常。

手动将栈的大小调小点

加上JVM参数:-XX:PermSize=10M -XX:MaxPermSize=10M,运行后会报如下异常:

Exception in thread "main"
java.lang.OutOfMemoryError: PermGen space。

常量池溢出

public class ConstantOOM {

 

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

List<String> list = new ArrayList<String>();

int i=0;

while(true){

list.add(String.valueOf(i++).intern());

}

}

 

}

分析:

我们知道常量池中存放的是运行过程中的常量,同时我们知道String类型的intern方法是将字符串的值放到常量池中的。所以上面弄可以开一个死循环将字符串的值都放到常量池中,这样常量池就会出现OOM异常了。因为常量池本身就是方法区的一部分,所以我们也可以手动地调节一下栈的大小。

推荐:

《深入理解Java虚拟机》



Tags:JVM监控   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
背景目前,有很多公司的WEB服务器会出现CPU、内存、IO告警,运维人员往往不能及时地获取JVM等相关信息,以便分析造成告警的原因,故本文将从几个方面来阐述如何进行JVM快照,如何分析...【详细内容】
2021-03-12  Tags: JVM监控  点击:(168)  评论:(0)  加入收藏
我们的监控系统是zabbix,最近刚做完jvm还有tomcat的监控,需要吐槽以下内容:...【详细内容】
2019-09-02  Tags: JVM监控  点击:(224)  评论:(0)  加入收藏
▌简易百科推荐
阿里云镜像源地址及安装网站地址https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b111kK44P更新源之前把之前的国外的镜像先备份一下 切换到yumcd...【详细内容】
2021-12-27  干程序那些事    Tags:CentOS7镜像   点击:(1)  评论:(0)  加入收藏
前言在实现TCP长连接功能中,客户端断线重连是一个很常见的问题,当我们使用netty实现断线重连时,是否考虑过如下几个问题: 如何监听到客户端和服务端连接断开 ? 如何实现断线后重...【详细内容】
2021-12-24  程序猿阿嘴  CSDN  Tags:Netty   点击:(12)  评论:(0)  加入收藏
一. 配置yum源在目录 /etc/yum.repos.d/ 下新建文件 google-chrome.repovim /etc/yum.repos.d/google-chrome.repo按i进入编辑模式写入如下内容:[google-chrome]name=googl...【详细内容】
2021-12-23  有云转晴    Tags:chrome   点击:(7)  评论:(0)  加入收藏
一. HTTP gzip压缩,概述 request header中声明Accept-Encoding : gzip,告知服务器客户端接受gzip的数据 response body,同时加入以下header:Content-Encoding: gzip:表明bo...【详细内容】
2021-12-22  java乐园    Tags:gzip压缩   点击:(8)  评论:(0)  加入收藏
yum -y install gcc automake autoconf libtool makeadduser testpasswd testmkdir /tmp/exploitln -s /usr/bin/ping /tmp/exploit/targetexec 3< /tmp/exploit/targetls -...【详细内容】
2021-12-22  SofM    Tags:Centos7   点击:(7)  评论:(0)  加入收藏
Windows操作系统和Linux操作系统有何区别?Windows操作系统:需支付版权费用,(华为云已购买正版版权,在华为云购买云服务器的用户安装系统时无需额外付费),界面化的操作系统对用户使...【详细内容】
2021-12-21  卷毛琴姨    Tags:云服务器   点击:(6)  评论:(0)  加入收藏
参考资料:Hive3.1.2安装指南_厦大数据库实验室博客Hive学习(一) 安装 环境:CentOS 7 + Hadoop3.2 + Hive3.1 - 一个人、一座城 - 博客园1.安装hive1.1下载地址hive镜像路径 ht...【详细内容】
2021-12-20  zebra-08    Tags:Hive   点击:(9)  评论:(0)  加入收藏
以下是服务器安全加固的步骤,本文以腾讯云的CentOS7.7版本为例来介绍,如果你使用的是秘钥登录服务器1-5步骤可以跳过。1、设置复杂密码服务器设置大写、小写、特殊字符、数字...【详细内容】
2021-12-20  网安人    Tags:服务器   点击:(7)  评论:(0)  加入收藏
项目中,遇到了一个问题,就是PDF等文档不能够在线预览,预览时会报错。错误描述浏览器的console中,显示如下错误:nginx代理服务报Mixed Content: The page at ******** was loaded...【详细内容】
2021-12-17  mdong    Tags:Nginx   点击:(7)  评论:(0)  加入收藏
转自: https://kermsite.com/p/wt-ssh/由于格式问题,部分链接、表格可能会失效,若失效请访问原文密码登录 以及 通过密钥实现免密码登录Dec 15, 2021阅读时长: 6 分钟简介Windo...【详细内容】
2021-12-17  LaLiLi    Tags:SSH连接   点击:(16)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条