Kotlin on JVM 协程的可重入实现

1. 协程?

协程的优势就是上下文切换的优势,不用打扰到操作系统。用户自己实现协程的切换。协程可以主动让出线程的能力,让Runtime进行调度。而面对线程而言,通常不是主动让出的,而是被操作系统强制调度。操作系统是感知不到Runtime层面的协程的,也不关心是不是正在进行协程调度。线程的现场信息由操作系统维护,协程的现场信息由Runtime来维护。

  • Kotlin on JVM 的“协程”,不是真正意义上的协程 ?
  • 效果上,比在Java线程池的的Runable基础上面,Runable 不具备暂停调度可恢复的特性。Runable从开始到结束一直占用当前线程,不管是runing还是wait,而Kotlin在协程”wait“的时候,会释放当前线程。
阅读更多

从ContextClassLoader到JDBC和SPI

SystemClassLoader

可以jvm参数 java.system.class.loader 设置默认的系统加载器,默认是当前线程的ContextClassLoader。来自sun.misc.Launcher.getLauncher的getClassLoader, 而getLauncher的getClassLoader实际来自Launcher.AppClassLoader.getAppClassLoader。

阅读更多

记一次类加载引起的Bug

1.起因

程序莫名其妙出了
error:java.lang.NullPointerException: Null reference used for synchronization (monitor-enter)
就是在使用同步锁的时候,是锁的对象是空的。很是奇怪,看代码没觉得啊。打印一下,确实是空的,Why?

阅读更多

如何定位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。

阅读更多