
Java
武汉红喜
专注于消息中间件
展开
-
Java核心技术解析
JUC JMM与线程安全 JUC 指令重排与内存屏障 JUC Java内存模型FAQ JUC 同步和Java内存模型 JUC volatile实现原理 JUC AQS详解 JUC AQS理解 JUC synchronized优化 JUC 线程和同步 JUC 线程状态 JUC 线程通信 JUC ThreadLocal介绍及原理 JUC 死锁及避免方案 JUC 读写锁简单实现 JUC 信号量 JUC 阻塞队列 NIO Overview NIO Channel NIO Buff原创 2020-06-21 17:16:23 · 533 阅读 · 0 评论 -
【转载】BitSet
本文转载自http://shift-alt-ctrl.iteye.com/blog/2194519 JAVA中BitSet就是“位图”数据结构,根据“位图”的语义,数据的存在性可以使用bit位上的1或0来表示;一个bit具有2个值:0和1,正好可以用来表示false和true。对于判断“数据是否存在”的场景,我们通常使用HashMap来存储,不过hashmap这个数据结构KEY和Value原创 2016-01-22 09:44:03 · 317 阅读 · 0 评论 -
【转载】JAVA内存模型和线程安全
本文转载自http://shift-alt-ctrl.iteye.com/blog/1845309 一.JAVA内存模型(JMM,JAVA Memory Model): 运行时涉及到两种内存,主内存和工作区内存,其中工作区内存通常为CPU的高速缓存区用来加快内存数据读取操作的(各线程独立).所有的变量内容都存在主内存中,当需要对内存数据进行操作时,数据将会从主存中load到工作区原创 2016-01-22 09:43:40 · 251 阅读 · 0 评论 -
【转载】JVM垃圾回收
本文转载自http://shift-alt-ctrl.iteye.com/blog/1842714 一.对象查找 在对对象回收之前,需要首先查找出亟待回收的对象,在JVM中,采取"根检索"算法来查找"死亡"的对象;这个算法的基本思想是通过一系列名为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所经过的路径为对象引用链;如果一个对象到GC Roots上没有任何引原创 2016-01-22 09:44:37 · 292 阅读 · 0 评论 -
JDBC中Connection解惑
参考http://shift-alt-ctrl.iteye.com/blog/1967020 关于JDBC中关于Connection的两个疑问: 1.Connection实例是线程安全的吗? 即一个connection实例,在多线程环境中是否可以确保数据操作是安全的?Java代码 private static Connection connection; ...原创 2016-01-22 09:44:09 · 3038 阅读 · 0 评论 -
【转载】Reference
本文转载自http://shift-alt-ctrl.iteye.com/blog/1839163 前言:java提供了几种引用类型,以方便编程者跟踪对象生命周期。 Reference抽象类提供了除强引用之外的其他引用类型基本功能。ReferenceQueue是一个队列(内部实现为一个Reference的列表),用于注册那些GC检测到不可达(即将会被回收)对象。 每个r原创 2016-01-22 09:43:11 · 356 阅读 · 0 评论 -
【转载】ArrayList 中数据删除
本文转载自http://shift-alt-ctrl.iteye.com/blog/1839147 在循环arrayLlist时,经常会遇到remove操作,那么arrayList的remove的底层是怎么做的?AbstractList中,有一个属性modCount,这个属性是跟踪list中数据被修改的次数,任何对list的add/remove操作,都将导致modCount++.在原创 2016-01-22 09:43:05 · 503 阅读 · 0 评论 -
【转载】JVM类加载机制小结
本文转载自http://shift-alt-ctrl.iteye.com/blog/1845137 一.类加载 虚拟机把class文件加载至内存之后,对字节码数据进行校验/解析/初始化等操作,最终形成可被VM直接使用的java类型,这就是虚拟机类加载机制.类的加载完全可以在运行时进行,这给VM提供了动态加载类提供了可行性. 类生命周期过程大概分为:加载-->校验-原创 2016-01-22 09:42:48 · 288 阅读 · 0 评论 -
【转载】JVM内存分配与调优参数列表
本文转载自http://shift-alt-ctrl.iteye.com/blog/1842631 一.运行时数据区: 程序计数器:它是一块较小的内存空间,主要作用是当前线程所执行的字节码的行号指示器.由于java虚拟机的多线程是通过轮流切换并分配处理器执行时间的方式来实现的(协作式/抢占式?!),即任何时刻,任一CPU只会正在处理一个线程的指令;为了确保线程切换后能够正确恢复原创 2016-01-22 09:42:42 · 329 阅读 · 0 评论 -
【转载】try-catch
本文转载自http://shift-alt-ctrl.iteye.com/blog/2156937 有时候一些小的细节,确实比较纠结,对于try-catch-finally代码块中代码依次执行,当try中有exception抛出时,将会有catch拦截并执行,如果没有catch区块,那么exception将被添加到“return栈顶”并执行finally。 1) 如果catch中原创 2016-01-22 09:42:30 · 328 阅读 · 0 评论 -
JVM宕机分析
一、能够引起JVM崩溃的常见原因有: 线程阻塞 CPU 使用率过高 JVM Crash 堆内存不足 类装载 Java虚拟机自身的Bug JDK与服务器(CPU、内存、操作系统)的兼容性 内存溢出 二、日志文件 hs_err_pid.log,致命错误出现的时候,JVM生成了hs_err_pid.log这样的文件,其中包含了虚拟机...转载 2018-03-09 17:50:30 · 2818 阅读 · 0 评论 -
Java8:Lambda表达式增强版Comparator和排序
1、概述在这篇教程里,我们将要去了解下已经发布的JDK8中的Lambda表达式——特别是怎样使用它来编写Comparator和对集合(Collection)进行排序。首先,让我们先定义一个简单的实体类:public class Human { private String name; private int age; public Human() {...原创 2018-03-09 17:49:50 · 6919 阅读 · 1 评论 -
栈和局部变量
Java栈概述 记得当初我学习java时,常常听见身边的朋友说:“你要记住,当new一个对象时,对象的引用存放在栈里,而对象是存放在堆里的”。当时,听到这句教导时,脑海里立即出现栈的模型——里面存的仅仅是个引用。最近,看了下《深入JVM》,才发现,原来栈并不是我想象的那么简单,它和我想象中的那个栈的结构差别非常大。 每当...原创 2018-03-09 17:49:25 · 1156 阅读 · 0 评论 -
排查Java线上服务故障的方法和实例分析
前言 作为在线系统负责人或者是一个技术专家,你可能刚刚接手一个项目就需要处理紧急故障,或者被要求帮忙处理一些紧急的故障,这个时候的情景是: (1)你可能对这个业务仅仅是听说过,而不怎么真正了解; (2)你可能没有这个故障的详细信息,比如可能仅仅是有使用方反馈服务中断了10分钟; (3)你对代码细节还没有仔细研究过。 这个时候该怎么解决问题呢?根据以前的经验,工程师们常...原创 2018-03-09 17:49:22 · 251 阅读 · 0 评论 -
Java 理论与实践: 正确使用 Volatile 变量
Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。 Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 sy...原创 2018-03-09 17:49:19 · 123 阅读 · 0 评论 -
如何创建线程
在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程。当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通使用的,需要在实践中不断积累。由于并发肯定涉及到多线程,因此在进入并发编程主题之前,我们先来了解一下进程和线程的由来,这对后面对并发编程的理解将会有很大的帮助。 下面是本...原创 2018-03-09 17:49:13 · 732 阅读 · 0 评论 -
Decorator模式及其他相似的模式
Decorator模式 package com.whatsmars.tomcat.design.decorator;/*** @author javahongxi 用户留言板处理的接口*/public interface MessageBoardHandler { /** * @author javahongxi 用户可以利用函数...原创 2018-03-09 17:49:01 · 133 阅读 · 0 评论 -
23种设计模式
目录 创建型 1. Factory Method(工厂方法) 2. Abstract Factory(抽象工厂) 3. Builder(建造者) 4. Prototype(原型) 5. Singleton(单例) 结构型 6. Adapter Class/Object(适配器) 7. Bridge(桥接) 8. Composite(组合) 9. D...原创 2018-03-09 17:48:52 · 137 阅读 · 0 评论 -
一步步优化JVM一:概述、方法及需求
现代JVM是一个具有灵活适应各种应用能力的软件,尽管很多应用能够在JVM的默认配置下运行良好,但是有些应用还是需要优化JVM配置以达到其性能要求。由于各种各样的应用能够运行在现在JVM上面,所以大量的JVM选项可以配置来提升应用的性能。不幸的是,对一个应用而言优化得很好的JVM配置,对应另外的应用不一定适合。所以,真正理解怎样优化JVM配置是非常有必要的...原创 2018-03-09 17:48:03 · 106 阅读 · 0 评论 -
聊聊内存泄露
一、Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址。Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的,所有对象的回收都是由Java虚拟机通过垃圾回收机制完成的。GC为了能够正确释放对象,会监控每个对象的运行状况,对他们的申请、引用、被引用、...原创 2018-03-09 17:47:40 · 124 阅读 · 0 评论 -
java 字节流和字符流的区别
字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,如图12-6所示。 <iframe id="iframe_0.4142593172691813" style="margin: 0...原创 2018-03-09 17:47:30 · 97 阅读 · 0 评论 -
Java:对象的强、软、弱和虚引用
本文介绍对象的强、软、弱和虚引用的概念、应用及其在UML中的表示。 author: ZJ 07-12-1 Blog: [url]http://zhangjunhd.blog.51cto.com/[/url] 1.对象的强、软、弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程...原创 2018-03-09 17:47:10 · 125 阅读 · 0 评论 -
单例应该这么写
public class DoubleCheckSingleton { private volatile static DoubleCheckSingleton instance = null; private DoubleCheckSingleton() {} public static DoubleCheckSingle...原创 2018-03-09 17:46:51 · 108 阅读 · 0 评论 -
一步步优化JVM六:优化吞吐量
如果你已经进行完了前面的步骤了,那么你应该知道这是最后一步了。在这一步里面,你需要测试应用的吞吐量和为了更高的吞吐量而优化JVM。 这一步的输入就是应用的吞吐量性能要求。应用的吞吐量是在应用层面衡量而不是在JVM层面衡量,因此,应用必须要报告出一些吞吐量指标或者应用的某些操作的吞吐量性能指标。观察到的吞吐量指标然后用可以用来和...原创 2018-03-09 17:46:48 · 280 阅读 · 0 评论 -
设计模式之六大原则
关于设计模式的六大设计原则的资料网上很多,但是很多地方解释地都太过于笼统化,我也找了很多资料来看,发现CSDN上有几篇关于设计模式的六大原则讲述的比较通俗易懂,因此转载过来。 原作者博客链接:http://blog.csdn.net/LoveLion/article/category/738450/7 一.单一职责原则 原文链接...原创 2018-03-09 17:46:19 · 100 阅读 · 0 评论 -
动态代理解释-JDK,CGLIB,JAVASSIST,ASM
动态代理是指在运行时,动态生成代理类。代理类的字节码将在运行时生成并载入当前的ClassLoader. 生成动态代理类的方法很多,如JDK自带的动态代理、CGLIB、Javassist或者ASM库。 JDK动态代理使用简单,它内置在JDK中,因此不需要引入第三方Jar包,但相对功能比较弱。CGLIB和Javassist都是高级的字节码生成库,总体...原创 2018-03-09 17:45:59 · 741 阅读 · 0 评论 -
HashMap解惑
HashMap中有一些我们容易忽视的点 1. 关于key的hash和equals public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } if (key == n...原创 2018-03-09 17:45:44 · 141 阅读 · 0 评论 -
一步步优化JVM二:JVM部署模型和JVM Runtime
选择JVM部署模型 JVM部署模型的选择总体来说就是决定应用是部署在单个JVM实例还是多个JVM实例上(这里简单举例说明一下JVM实例,比如:我们常用eclipse开发,启动一个eclipse就是启动了一个JVM实例,然后在JVM中运行一个main程序,又会启动一个JVM实例,两个JVM实例是隔离开的)。哪一个是最适...原创 2018-03-09 17:45:32 · 134 阅读 · 0 评论 -
Java 如何有效地避免OOM:善于利用软引用和弱引用
想必很多朋友对OOM(OutOfMemory)这个错误不会陌生,而当遇到这种错误如何有效地解决这个问题呢?今天我们就来说一下如何利用软引用和弱引用来有效地解决程序中出现的OOM问题。下面是本文的目录大纲: 一.了解 强引用、软引用、弱引用、虚引用的概念 二.进一步理解软引用和弱引用 三.如何利用软引用和弱引用解决OOM问题 ...原创 2018-03-09 17:44:49 · 95 阅读 · 0 评论 -
Integer.valueOf(int)及自动装箱内幕
Integer为什么要提供功能与new Integer(xx)一样的valueOf(xx)方法呢,看了源代码之后,我发现了惊人的内幕。 public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= Inte...原创 2018-03-09 17:44:40 · 116 阅读 · 0 评论 -
【转】动态字节码技术跟踪Java程序
Whats is Java Agent? .. java.lang.instrument.Instrumentation 之前有写 基于AOP的日志调试 讨论一种跟踪Java程序的方法, 但不是很完美.后来发现了 Btrace , 由于它借助动态字节码注入技术 , 实现优雅且功能强大.只不过, 用起来总是磕磕绊绊的, 时常为了跟踪某个问题,...原创 2018-03-09 17:44:34 · 221 阅读 · 0 评论 -
JAVA序列化/反序列化与单例
单例设计类:package com.test.singleton; import java.io.IOException; import java.io.ObjectStreamException; import java.io.Serializable; public class SingleTon implements Serializable{ ...原创 2018-03-09 17:44:20 · 707 阅读 · 0 评论 -
一步步优化JVM三:GC优化基础
本节主要描述关于垃圾回收器性能的三个指标,三个关于垃圾回收器优化的基本原则,以及优化HotSpot VM的垃圾回收器的信息收集,在这些指标中权衡以及信息的收集是非常重要的。 性能指标 吞吐量: 衡量垃圾回收器运行在性能峰值的时候不需要关心垃圾回收器暂停的时间或者需要占用内存的能力。 ...原创 2018-03-09 17:44:17 · 89 阅读 · 0 评论 -
Java内部类详解
说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉。原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法。今天我们就来一探究竟。下面是本文的目录大纲: 一.内部类基础 二.深入理解内部类 三.内部类的使用场景和好处 四.常见的与内部类相关的笔试面试题 ...原创 2018-03-09 17:40:35 · 97 阅读 · 0 评论 -
Java中的Unsafe
在阅读AtomicInteger的源码时,看到了这个类:sum.msic.Unsafe,之前从没见过。所以花了点时间google了一下。 Unsafe的源码:http://www.docjar.com/html/api/sun/misc/Unsafe.java.html Unsafe源码中的描述如下: 写道A collection of methods for per...原创 2018-03-09 17:43:38 · 121 阅读 · 0 评论 -
浅析Java中的final关键字
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字。另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法。下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正。 ...原创 2018-03-09 17:43:29 · 70 阅读 · 0 评论 -
站在Java的角度看LinkedList
站在Java的角度看,玩队列不就是玩对象引用对象嘛! public class LinkedList<E> implements List<E>, Deque<E> { Node<E> first; Node<E> last; int size; public bool...原创 2018-03-09 17:43:20 · 93 阅读 · 0 评论 -
一步步优化JVM四:决定Java堆的大小以及内存占用
到目前为止,还没有做明确的优化工作。只是做了初始化选择工作,比如说:JVM部署模型、JVM运行环境、收集哪些垃圾回收器的信息以及需要遵守垃圾回收原则。这一步将介绍如何评估应用需要的内存大小以及Java堆大小。首先需要判断出应用存活的数据的大小,存活数据的大小是决定配置应用需要的Java堆大小的重要条件,也能够决定是否需要重新审视一下应用的内存需求或者修改...原创 2018-03-09 17:43:14 · 150 阅读 · 0 评论 -
海子-JVM的内存区域划分
学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢? 由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: ...原创 2018-03-09 17:43:11 · 128 阅读 · 0 评论 -
JIT
Java JIT(just in time)即时编译器是sun公司采用了hotspot虚拟机取代其开发的classic vm之后引入的一项技术,目的在于提高java程序的性能,改变人们“java比C/C++慢很多”这一尴尬印象。 说起来是编译器,但此编译器与通常说的javac那个编译器不同,它其实是将字节码编译为硬件可执行的机器码的。 图片来自于网络...原创 2018-03-09 17:42:56 · 523 阅读 · 0 评论