随笔分类 - java
摘要:输出GC日志 通过阅读GC日志,我们可以了解Java虚拟机内存分配与回收策略。 先来看一个简单的示例。 下面是GC日志: 0.115: [GC (System.gc()) [PSYoungGen: 3020K->600K(38400K)] 3020K->608K(125952K), 0.001229
阅读全文
摘要:在生产者消费者模型这篇文章中我们使用了ReentrantLock结合Condition实现生产者消费者模型,但我们对于ReentrantLock和Condition的工作原理并不了解,其内部的结构和源码级别实现就更加不了解了。比如在使用await方法的时候,为什么一定要用while判断条件,用if为
阅读全文
摘要:记得去年学习Spring MVC的时候自己学着写了一个小小的框架,用了一个AppContext来表示应用上下文,每个请求都应该有各自独立的AppContext,里面可以存储一些数据,比如数据库连接Connection等,此时考虑数据库的事务问题,即在一个线程内,一个事务的多个操作拿到的是一个Conn
阅读全文
摘要:在JDK9中,包含了一个叫Variable Handles的新功能,下面是该功能的描述: Define a standard means to invoke the equivalents of various java.util.concurrent.atomic and sun.misc.Uns
阅读全文
摘要:在Java中,我们想在程序运行时调用其方法,可以用JDK提供的反射相关API来实现,代码如下: Class clazz = Demo.class; Method method = clazz.getMethod("studyHard", new Class[]{String.class}); Dem
阅读全文
摘要:反射是Java语言中一个比较重要的特性,它允许对正在运行的Java进行观测,甚至动态修改程序,即在运行态,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。 反射API介绍 获取Class对象 通常来说,使用反射API的第一步是获取Class对象,在J
阅读全文
摘要:ReentrantLock源码学习 - 释放锁(unlock) 上次谈到了利用ReentrantLock的非公平和公平加锁方式,那么接下来看看释放锁的流程 首先调用ReentrantLock的unlock方法 public void unlock() { sync.release(1); } 然后会
阅读全文
摘要:ReentrantLock 学习 - 获取锁(JDK 1.8) ReentrantLock 提供非公平锁与公平锁两种加锁方式, 默认加锁方式为非公平锁。 ReentrantLock类的结构为: 从图中可以看出,ReentrantLock类包含三个静态内部类: Sync NonfairSync Fai
阅读全文
摘要:生产者消费者问题是一个常见而且经典的问题,相信了解过多线程或者消息队列的同学对这个名词并不陌生。正如Java常用的设计模式一样,生产者消费者问题是为了解决某一类问题而存在,参阅维基百科对Producer–consumer problem的描述: In computing, the producer–
阅读全文
摘要:前面我们总结了Java虚拟机的监控及诊断工具(命令行)相关命令的使用,用命令行虽然说比较方便,但不够直观,要是有图形显示JVM运行的一些情况就好了。eclipse MAT 和 Java Mission Control 是两个使用比较广泛的GUI虚拟机的监控及诊断工具,下面让我们来用用吧。 Eclip
阅读全文
摘要:对于普通的开发人员来说,可以阅读帮助文档或者源码来对JDK的设计以及JVM的内存管理获取一定的了解,但对于线上运行的程序,如何对程序进行监控和诊断呢?比如一个程序挂了,怎么通过分析堆栈信息、GC日志、线程快照等信息来快速定位问题?JDK的大佬早就为我们考虑到这一点,所以在JDK中包含了许多用于监控及
阅读全文
摘要:Channel介绍 Channel? 我们在使用Buffer的时候,需要往Buffer中放数据,再从Buffer中取数据,那么在NIO体系中,与Buffer交互是什么呢,没错,就是Channel。所有的NIO的I/O操作都是从Channel 开始的,读操作的时候将Channel中的数据填充到Buff
阅读全文
摘要:Selector是Java NIO中实现多路复用的关键,用于检查一个或多个NIO Channel 的状态是否处于可连接、可接收、可读、可写状态。单个单线程通过Selector来管理多个Channel,减少线程上下文切花能带来的开销。 Selector是一个抽象类,具体是通过SelectorProvi
阅读全文
摘要:Buffer?我们很容易想到缓冲区的概念,在NIO中,它是直接和Channel打交道的缓冲区,通常场景或是从Buffer写入Channel,或是从Channel读入Buffer。Buffer是一个抽象类,Java提供如下图的实现类,我是直接在Eclipse截出来的_ 其实核心是ByteBuffer,
阅读全文
摘要:最近碰到几道关于i++与++i相关的题,我们从字节码角度来分析执行情况,该文章需要读者有字节码相关基础及了解方法调用机制。 分析 下面是一个题,请问下面代码输出什么? public static void f() { int i = 1; System.out.println(i++ + i++);
阅读全文
摘要:平时接触动态代理比较多,例如Spring等框架如何使用了动态代理经常听到,本文主要介绍JDK动态代理的基本实现原理(JDK8版本),当了解了这些实现细节后,再次使用动态代理就会十分容易和清楚,知其然也知其所以然。 动态代理Demo 先来看一下利用JDK动态代理写的Demo,下面会根据这个Demo进行
阅读全文
摘要:javap命令可以用来查阅字节码文件,可以将指定的字节码文件反编译,反解析出当前类对应基本信息、常量池(Constant pool)、字段区域、 方法区(Code[JVM指令集])、异常表(Exception table)、本地变量表(LocalVariableTable)、行数表(LineNumb
阅读全文