一、实战死循环导致CPU飙高

top -p pid -H

jstack pid

printf "%s"  十进制的线程id

二、创建CUP100%实例(死循环)

1、创建CpuController

@RestController
public class CpuController { @RequestMapping("/loop")
public List<Long> loop(){
String data = "{\"data\":[{\"partnerid\":]}";
return getPartneridsFromJson(data);
} public static List<Long> getPartneridsFromJson(String data){
//{\"data\":[{\"partnerid\":982,\"count\":\"10000\",\"cityid\":\"11\"},{\"partnerid\":983,\"count\":\"10000\",\"cityid\":\"11\"},{\"partnerid\":984,\"count\":\"10000\",\"cityid\":\"11\"}]}
//上面是正常的数据
List<Long> list = new ArrayList<Long>(2);
if(data == null || data.length() <= 0){
return list;
}
int datapos = data.indexOf("data");
if(datapos < 0){
return list;
}
int leftBracket = data.indexOf("[",datapos);
int rightBracket= data.indexOf("]",datapos);
if(leftBracket < 0 || rightBracket < 0){
return list;
}
String partners = data.substring(leftBracket+1,rightBracket);
if(partners == null || partners.length() <= 0){
return list;
}
while(partners!=null && partners.length() > 0){
int idpos = partners.indexOf("partnerid");
if(idpos < 0){
break;
}
int colonpos = partners.indexOf(":",idpos);
int commapos = partners.indexOf(",",idpos);
if(colonpos < 0 || commapos < 0){
//partners = partners.substring(idpos+"partnerid".length());//
continue;
}
String pid = partners.substring(colonpos+1,commapos);
if(pid == null || pid.length() <= 0){
//partners = partners.substring(idpos+"partnerid".length());//
continue;
}
try{
list.add(Long.parseLong(pid));
}catch(Exception e){
//do nothing
}
partners = partners.substring(commapos);
}
return list;
} }
getPartneridsFromJson发生死循环

2.打包
D:\workspace\monitor_tuning>mvn clean package -Dmaven.test.skip pom.xml的配置如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId>
<artifactId>monitor_tuning</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>monitor_tuning</name>
<description>Demo project for Spring Boot</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<!-- compile for Java 1.8 -->
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerArgs>
<!-- 过期的方法的警告-->
<arg>-Xlint:deprecation</arg>
</compilerArgs>
<compilerArguments>
<!-- 是否输出所有的编译信息(包括类的加载等)-->
<!--<verbose />-->
<!-- 解决maven命令编译报错,因为rt.jar 和jce.jar在jre的lib下面,不在jdk的lib下面,
导致maven找不到(java7以后会出现这个问题),将这2个jar包拷贝到jdk的lib下面估计也好使-->
<bootclasspath>${java.home}\lib\rt.jar;${java.home}\lib\jce.jar</bootclasspath>
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins>
</build> </project>  

端口设置为9080

3、生成jar完成后,将它放在测试服务器

nohup java -jar monitor_tuning-0.0.1-SNAPSHOT.jar

 
四、我这里是将 monitor_tuning以war包的的形式部署到我的测试服务器
1)打开多个页面调用loop方法
http://*.*.*.*:7080/monitor_tuning/loop 2)使用top命令查看cpu的使用
3、jstack 20738 > 20738.txt
sz 20738.txt 下载文件 4、 打印所有的线程
top -p 20738 -H

打印946为10进制,结果为3b2

打开刚才的20738.txt文件

查找3b2

这样就定位到了getPartneridsFromJson这个方法。

三、创建CUP100%实例(死锁)

创建两个线程,线程1先获得锁1,然后获得锁2; 线程二先获得锁2,然后获得锁1. 然后两个线程造成死锁。

  private Object lock1 = new Object();
private Object lock2 = new Object(); /**
* 死锁
*/
@RequestMapping("/deadlock")
public String deadlock(){
new Thread(()->{
synchronized (lock1){
try {
Thread.sleep(1000);
synchronized (lock2){
System.out.println("Thread1 over");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start(); new Thread(()->{
synchronized (lock2){
try {
Thread.sleep(1000);
synchronized (lock1){
System.out.println("Thread2 over");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start(); return "deadlock";
}

  

jstack 8704 > 8704.txt 8704为tomcat的进程

将8704.txt拉到底部,可以看到死锁的信息。

Found one Java-level deadlock:
=============================
"Thread-9":
waiting to lock monitor 0x0000000000eaeb08 (object 0x00000000f6d7abf8, a java.lang.Object),
which is held by "Thread-8"
"Thread-8":
waiting to lock monitor 0x00007f82ac0062c8 (object 0x00000000f6d7ac08, a java.lang.Object),
which is held by "Thread-9" Java stack information for the threads listed above:
===================================================
"Thread-9":
at com.example.monitor_tuning.chapter2.CpuController.lambda$deadlock$1(CpuController.java:52)
- waiting to lock <0x00000000f6d7abf8> (a java.lang.Object)
- locked <0x00000000f6d7ac08> (a java.lang.Object)
at com.example.monitor_tuning.chapter2.CpuController$$Lambda$389/1326472202.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
"Thread-8":
at com.example.monitor_tuning.chapter2.CpuController.lambda$deadlock$0(CpuController.java:39)
- waiting to lock <0x00000000f6d7ac08> (a java.lang.Object)
- locked <0x00000000f6d7abf8> (a java.lang.Object)
at com.example.monitor_tuning.chapter2.CpuController$$Lambda$388/1104652864.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748) Found 1 deadlock.

  

												

jstack实战死循环与死锁学习笔记的更多相关文章

  1. 《Node.js开发实战详解》学习笔记

    <Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...

  2. 《Cocos2d-x游戏开发实战精解》学习笔记4--实战一个简单的钢琴

    上一节学习了使用Cocos2d-x播放音乐的方法,但是那种方法一般只适合于播放较大的音乐,而一般比较短小的音乐(如游戏中的打斗.按键音效等)则要通过playEffect来播放.本节使用该方法以及之前学 ...

  3. 《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音

    <Cocos2d-x游戏开发实战精解>学习笔记1--在Cocos2d中显示图像 <Cocos2d-x游戏开发实战精解>学习笔记2--在Cocos2d-x中显示一行文字 之前的内 ...

  4. Spring实战第六章学习笔记————渲染Web视图

    Spring实战第六章学习笔记----渲染Web视图 理解视图解析 在之前所编写的控制器方法都没有直接产生浏览器所需的HTML.这些方法只是将一些数据传入到模型中然后再将模型传递给一个用来渲染的视图. ...

  5. Spring实战第五章学习笔记————构建Spring Web应用程序

    Spring实战第五章学习笔记----构建Spring Web应用程序 Spring MVC基于模型-视图-控制器(Model-View-Controller)模式实现,它能够构建像Spring框架那 ...

  6. Spring实战第四章学习笔记————面向切面的Spring

    Spring实战第四章学习笔记----面向切面的Spring 什么是面向切面的编程 我们把影响应用多处的功能描述为横切关注点.比如安全就是一个横切关注点,应用中许多方法都会涉及安全规则.而切面可以帮我 ...

  7. 《Cocos2d-x游戏开发实战精解》学习笔记2--在Cocos2d-x中显示一行文字

    在Cocos2d-x中要显示文字就需要用到Label控件.在3.x版本的Cocos2d中,舍弃了之前版本所使用的LabelTTF.LabelAtlas.LabelBMFont 3个用于显示文字的类,而 ...

  8. 《Cocos2d-x游戏开发实战精解》学习笔记1--在Cocos2d中显示图像

    Cocos2d-x中的图像是通过精灵类来显示的.在Cocos2d-x中游戏中的每一个角色.怪物.道具都可以理解成是一个精灵,游戏背景作为一种特殊的单位将其理解成是一个精灵也没有什么不妥.在源文件本章目 ...

  9. 《MySQL实战45讲》学习笔记1——MySQL的基础架构

    在<极客时间>订阅了<MySQL实战45讲>专栏,总觉得看完和没看一样

随机推荐

  1. phpexcel 的使用

    首先到phpexcel官网上下载最新的phpexcel类,下周解压缩一个classes文件夹,里面包含了PHPExcel.php和PHPExcel的文件夹,这个类文件和文件夹是我们需要的,把class ...

  2. java学习笔记18(基本类型包装类,system类)

    基本类型包装类 定义:程序界面用户输入的数据都是以字符串类型存储的,如果需要操作这些字符串进行运算,需要转成基本数据类型,这时就要用到基本类型包装类,例: public class Demo { pu ...

  3. float浮动,定位

    1 浮动定位    1.普通流定位        普通流,由称为文档流        块级元素:从上到下一个一个的排列        行内元素:一行内从左到右的排列    2.浮动定位         ...

  4. Hibernate项目的创建

    首先,我们需要知道,Hibernate是一个不需要建立在容器的基础上的一个框架,所以在java项目中同样可以运行. 为了证明,我们在这次程序的创建中,用JavaProject文件来实现Hibernat ...

  5. mAP的计算

    参加郑良博士的代码:  mars_evaluation 其中ap这样算: ap = ap + (recall - old_recall)*((old_precision+precision)/2); ...

  6. WEBBASE篇: 第一篇, HTML知识1

    HTML知识1 1,web概述 WEB就是互联网上的一种应用程序 - 网页程序: 程序结构: (1)C / S: C:Client 客户端:S:Server 服务器: (2)B / S: B:Brow ...

  7. SQL Server导入导出表及备份恢复

    1.   导出: 2.   导入

  8. ATM-java

    通过学习JAVA,我的进步不是很多,了解了不多的编程知识,但是我一直在进步,我发现我有很大的进步空间,每天都有一点点的进步使我每天都很充实.还记得我编写的第一个 经典程序“hello Word”.从那 ...

  9. Stm32L0串口中断接收使用

    最新在做LoRa的项目,使用的是STM32L072和SX1276,需要做一个串口透传模块,刚开始做demo的时候不考虑功耗,所以串口发送和接收直接使用下列函数执行: HAL_UART_Transmit ...

  10. 《DSP using MATLAB》Problem 6.16

    从别的地方找来的: 截图有些乱. 结构流程图如下