JVM的命令行参数参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
java import java.util.List; import java.util.LinkedList;
public class HelloGC {
public static void main(String[] args) {
System.out.println("HelloGC!");
List list = new LinkedList();
for(;;) {
byte[] b = new byte[1024*1024];
list.add(b);
}
}
}
每种垃圾回收器的日志格式是不同的!
![]()
![]()
total = eden + 1个survivor
这个问题比较业余,因为很多不同的服务器配置都能支撑(1.5G 16G)
1小时360000集中时间段,100个订单/秒(找一小时内的高峰期,1000订单/秒)
经验值,一个订单产生需要多少内存?512K * 1000 500M内存
专业一点儿问法:要求响应时间100ms
12306应该是中国并发量最大的秒杀网站:号称并发量100W最高
CDN -> LVS -> NGINX -> 业务系统 -> 每台机器1W并发(10K问题) 100台机器(redis可以解决单机10K并发)
减库存最后还会把压力压到一台服务器
可以做分布式本地库存 + 单独服务器做库存均衡
大流量的处理方法:分治
有一个50万PV的资料类网站(从磁盘提取文档到内存)原服务器32位,1.5G的堆
用户反馈网站比较缓慢,因此公司决定升级,新的服务器为64位,16G 的堆内存
结果用户反馈卡顿十分严重,反而比以前效率更低了
很多用户浏览数据,很多数据load到内存,内存不足,频繁GC,STW长,响应时间变慢
内存越大,FGC时间越长,咋办?
工作线程占比高 | 垃圾回收线程占比高
测试代码:
package com.test.jvm.gc;
import java.math.BigDecimal;<br></br>import java.util.ArrayList;<br></br>import java.util.Date;<br></br>import java.util.List;<br></br>import java.util.concurrent.ScheduledThreadPoolExecutor;<br></br>import java.util.concurrent.ThreadPoolExecutor;<br></br>import java.util.concurrent.TimeUnit;
/** * 从数据库中读取信用数据,套用模型,并把结果进行记录和传输 */
public class T15FullGCProblem01 {
private static class CardInfo {
BigDecimal price = new BigDecimal(0.0);
String name = "张三";
int age = 5;
Date birthdate = new Date();
public void m() {}
}
private static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(50,
new ThreadPoolExecutor.DiscardOldestPolicy());
public static void main(String[] args) throws Exception {
executor.setMaximumPoolSize(50);
for (;;){
modelFit();
Thread.sleep(100);
}
}
private static void modelFit(){
List<CardInfo> taskList = getAllCardInfo();
taskList.forEach(info -> {
// do something
executor.scheduleWithFixedDelay(() -> {
//do sth with info
info.m();
}, 2, 3, TimeUnit.SECONDS);
});
}
private static List<CardInfo> getAllCardInfo(){
List<CardInfo> taskList = new ArrayList<>();
for (int i = 0; i < 100; i++) {
CardInfo ci = new CardInfo();
taskList.add(ci);
}
return taskList;
}
}
java -Xms200M -Xmx200M -XX:+PrintGC com.test.jvm.gc.T15FullGCProblem01
一般是运维团队首先收到报警信息(CPU Memory)
![]()
出了问题容易定位
自定义ThreadFactory
jstat -gc pid
动态观察gc情况 / 阅读GC日志发现频繁GC / arthas观察 / jconsole / jvisualVM / Jprofiler(最好用)
jstat -gc 4655
500 : 每个500个毫秒打印GC的情况
测试,测试的时候进行监控!(压测观察)
动态图的一张截图,查找前面20个(histogram),执行该命令对在线系统略有影响
jmap - histo pid | head -20
手动导出堆转储文件,执行该命令对在线系统影响非常高
jmap -dump:format=b,file=xxx pid
java -Xms20M -Xmx20M -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError
com.test.jvm.gc.T15FullGCProblem01
![]()
java -Djava.rmi.server.hostname=192.168.17.11 -
Dcom.sun.management.jmxremote -
Dcom.sun.management.jmxremote.port=11111 -
Dcom.sun.management.jmxremote.authenticate=false -
Dcom.sun.management.jmxremote.ssl=false XXX
192.168.17.11 basic localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
service iptables stop
chkconfig iptables off // 永久关闭
windows上打开 jconsole远程连接 192.168.17.11:11111
https://www.cnblogs.com/YC-L/p/14418763.html
![]()
github地址:https://github.com/alibaba/arthas/blob/master/README_CN.md
arthas-boot
(推荐)下载arthas-boot.jar
,然后用java -jar
的方式启动
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
打印帮助信息
java -jar arthas-boot.jar -h
如果下载速度比较慢,可以使用aliyun的镜像
java -jar arthas-boot.jar --repo-mirror aliyun --use-http
as.sh
Arthas 支持在 Linux/Unix/Mac 等平台上一键安装,请复制以下内容,并粘贴到命令行中,敲 Enter
执行即可
curl -L https://arthas.aliyun.com/install.sh | sh
as.sh
到当前目录,你可以放在任何地方或将其加入到 $PATH
中./as.sh
,就会进入交互界面./as.sh -h
来获取更多参数信息java -jar arthas-boot.jar
选择想要检查的进程编号,artha挂载(attach)到进程上
![]()
jvm观察jvm信息(类似jinfo),thread定位线程问题
dashboard 观察系统情况(类似于top命令)
heapdump(相当于jmap -dump) + jhat分析(-J 参数是 maxmum heap size)
heapdump /root/1.hprof
jhat -J-max512M /root/1.hprof
![]()
访问7000端口可以得到分析结果
可以使用jdk1.8的JVM监控工具jhat中的OQL功能查找特定问题对象
https://www.cnblogs.com/baihuitestsoftware/articles/6406271.html
jhat -J-mx512M xxx.dump http://192.168.17.11:7000
远程连接主机,打开导出的dump文件
线上运行的类出了问题,先启动arthas,然后挂载到该进程,vim修改java文件,然后执行下面的redefine指令
redefine /root/TT.class
目前有些限制条件
声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。
本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。
我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。
微信扫码关注 HaowuliaoA 订阅号