如何定位CPU占用最高的代码块?

1. 先利用top查看 占用较高的进程

2 。利用 top -Hp pid 或 ps H -p pid -o pid,tid,pmem,pcpu,time,comm。查看某个进程中的线程占用CPU的情况。

3. 利用jstack pid 对应某个线程,注意 jstack 中的 nid 是16进制的,注意转换。

4.可以在线程启动的时候,设置线程的name,方便快速定位。

类加载器之间的关系

本次我们主要讨论子类和父类的类加载器之前的关系, 以及包含之前的类加载器关系。
我们自定义一个classloder,设置父加载器为null,这样保证都是自己来加载,指向的路径和AppClassloader一致,这样方便2个都好直接加载

阅读更多

static final String 与类的加载与初始化问题

题目

  • 下面的代码会不会导致Student类的加载初始化

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class ClassLoadTest {
    public static void main(String[] args) {
    System.out.println(Student.final_str);
    }
    }

    class Student {
    //在编译阶段编译阶段,加入到了类的常量池中,没有直接引用到类,不会触发类的初始化
    static final String final_str = "final world";
    static String str = "str world";
    }
阅读更多

Synchronized偏向锁批量重偏向与批量撤销

1.批量重偏向

  • intx BiasedLockingBulkRebiasThreshold = 20 默认偏向锁批量重偏向阈值

  • 可以通过JVM参数 -XX:BiasedLockingBulkRebiasThreshold手动设置阈值

    起因:

    当一个线程A对某个类生成大量的对象的对象,这些对象偏向了A,后面突然有来了个线程B去抢线程A生成的对象,就会导致偏向锁的升级为轻量级锁,如果总是在不断的升级锁,到了一定的阈值,JVM 就会对类的所有对象进行批量的重新偏向与B。

阅读更多

Ubuntu编译glibc库来验证Synchronized锁优化效果

0.前言


当然你可以说通过JOL查看对象的头信息,当然那个也是一种方法,但那个只能说明是这种状态,没有过程,本次主要结合来验证,Synchronized 关键字锁的状态:无锁、偏向锁、轻量级锁、重量级锁

基于Ubuntu16测试成功。18测试失败,centos没有测试




主要是在Java调用系统函数的时候,打印log。但是在Java里面打印线程ID是JVM层面的。需要自己实现一个native方法,在java层面调用。最后对比对应的PID 和TID,发现查看当前线程调用了几次系统锁
Java 的重量级级锁都是通过glibc库的pthread_mutex_lock函数实现的,是在和操作系统级别的锁。

阅读更多

JVM参数

1.参数级别

其一是标准参数(-)

所有的JVM实现都必须实现这些参数的功能,而且向后兼容;

其二是非标准参数(-X)

默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;

其三是非Stable参数(-XX)

此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;

阅读更多

pthreadID 线程ID 复用证明

背景

pthread 库中有一个 pthread_self() 接口用来获取线程 ID,但是这个 ID并不是内核中那个线程 ID,pthread_t 到底是个什么样的数据结构呢?因为 POSIX 标准并没有限制 pthread_t 的数据类型,所以该类型取决于具体实现。对于 Linux 目前使用的 NPTL 实现而言,pthread_t 类型的线程 ID,本质上就是一个进程地址空间上的一个地址,而且 pthread_t 类型的线程 ID很有可能被复用。进程之间不会存在重复的线程 ID,而且不同线程之间也不会重复,在任意时刻都是全局唯一的值。

阅读更多