分类: Java

24 篇文章

深入理解 Java 锁与线程阻塞
相信大家对线程锁和线程阻塞都很了解,无非就是 synchronized, wait/notify 等, 但是你有仔细想过 Java 虚拟机是如何实现锁和阻塞的呢?它们之间又有哪些联系呢?如果感兴趣的话请接着往下看。 为保障多线程下处理共享数据的安全性,Java 语言给我们提供了线程锁,保证同一时刻只有一个线程能处理共享数据。当一个锁被某个线程持有的时候,另一个线程尝试去获取这个锁将产生线程阻塞,直…
深入理解 System.loadLibrary
本文主要讲述 Android 加载动态链接库的过程及其涉及的底层原理。 会先以一个Linux的例子描述native层加载动态链接库的过程, 再从Java层由浅入深分析System.loadLibrary 首先我们知道在Android(Java)中加载一个动态链接库非常简单,只需一行代码: System.loadLibrary("native-lib"); 事实上这是Java提供的API,对于Jav…
理解 JNI 技术
JNI 即Java native interface,,是一种技术,提供了丰富的接口,可以在Java层调用native代码,也可以在native层调用Java代码,native代码一般是指C/C++程序。JNI就像是一座桥,连通着Java与native。阅读Android源代码的时候可以发现其用了大量的JNI技术,如果要深入学习Android了解JNI技术是必不可少的。在追求性能,对安全性要求高或…
thumbnail
JVM 内存结构与内存溢出异常
本文为《深入理解Java虚拟机》读书笔记,加入了一些自己的见解。 Jvm内存溢出异常就是我们常说的OOM,即java.lang.OutOfMemoryError,当然还包括java.lang.StackOverflowError。 那么它和内存泄漏有什么区别与联系呢? 对于内存泄漏,维基百科的定义是:在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。 对应于Java虚拟机…
《Java 并发编程实战》笔记
线程带来的风险: 1. 安全性问题(永远不发生糟糕的事,避免竞态条件) 2. 活跃性问题(某个正确的事情最终会发生,死锁,饥饿,死锁) 3. 性能问题 线程安全性:当多个线程访问某个类时,这个类始终能表现出正确的行为,那么就称这个类时线程安全的。 竞态条件:在并发编程中,由于不恰当的执行时序而出现不正确的结果。 锁可重入意味着获取锁的操作的粒度是线程而不是调用。 在没有同步的情况下,编译器,处理器…
能力值控制实现文档
SMB能力值控制实现文档 功能需求 服务消息总线接口管理添加能力值字段,能力控制体现为:调用次数上限/秒。 第三方应用调用消息服务总线提供的服务接口时,需要实现服务能力权限控制功能。 主要操作类 net.rubyeye.xmemcached.MemcachedClient 获取方法: MemcachedBaseService.getMemcachedService().getCache(); 方法…
前端乱码解决方案
前端接收乱码 1.response.addHeader("Content-Type", "text/xml" + "; charset=" + CommunicateService.charset); 2. 字节流 3. ///////////// 4. //这句话的意思,是让浏览器用utf8来解析返回的数据 5. response.setHeader("Content-type", "text/…
Spring 配置头文件
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.s…
Spring-in-action
Spring: Ioc(控制反转 Inversion of Control):依赖注入(DI)。 Aop(面向切面编程 Aspect Oriented Programming): 动态代理。 应用上下文: ClassPathXmlApplicationContext:从类路径下的xml配置文件中加载。 FileSystemXmlapplicationcontext:读取文件系统下的xml配置文件并…
Java 加密与解密的艺术
单向加密算法:MD5,SHA。用于数据完整性验证。 对称加密算法:DES。数据储存加密的常用算法。 非对称加密算法:RSA。数据传输加密的常用算法。 柯克霍夫原则:密码系统应该就算被所有人知道系统的运作步骤,仍然是安全的。 Java API支持: MessageDigest类构建MD5,SHA两种加密算法; Mac类可以构建HMAC加密算法; Cipher类可以构建多种加密算法,如DES、AES、…
thumbnail
Java volatile 关键字
Java 内存模型: 线程安全: 原子性:由Java内存模型直接保证的原子性变量操作包括read,load,user,assign,stroe,write,大致可认为Java基础数据类型的读写是具备原子性的。Java内存模型还提供了lock和unlock,由高层字节码指令monitorenter和monitorexit隐匿地使用,反应到Java代码就是synchronized关键字。因此synch…
关于 ThreadLocal 对象
ThreadLocal,线程本地变量,由于是线程内变量不存在并发问题,所以线程内可以安全的使用。 使用场景: 用来解决 数据库连接、Session管理等。 由于每次都是在方法内部创建的连接,那么线程之间自然不存在线程安全问题。但是这样会有一个致命的影响:导致服务器压力非常大,并且严重影响程序执行性能。由于在方法中需要频繁地开启和关闭数据库连接,这样不尽严重影响程序执行效率,还可能导致服务器压力巨大…
基于 NIO 的 Socket
缓冲区及其操作是所有NIO的基础。 传统流IO是基于字节的,所有IO都被视为单个字节的移动;而NIO是基于块的,NIO的性能肯定优于流IO。其性能的提高主要要得益于其使用的结构更接近操作系统执行IO的方式:通道和缓冲器。我们可以把它想象成一个煤矿,通道是一个包含煤层(数据)的矿藏,而缓冲器则是派送到矿藏的卡车。卡车载满煤炭而归,我们再从卡车上获得煤炭。也就是说,我们并没有直接和通道交互;我们只是和…
【转】关键业务系统的 JVM 启动参数推荐
原文地址 在关键的业务系统里,除了继续追求技术人员最爱的高吞吐与低延时之外,系统的稳定性与出现问题时排查的便捷性也很重要。 这是本文的一个原则,后面也会一次又一次的强调,所以与网上其他的文章略有不同,请调优高手和运维老大们多指引。 前言1,资料 学习开源项目的启动脚本是个不错的主意,比如Cassandra家的, 附送一篇解释它的文章。 JVM调优的"标准参数"的各种陷阱 R大的文章,在JDK6时写…
使用 NIO 提升性能
在nio中和Buffer配合使用的还有Channel。Channel是一个双向通道,既可读,也可写。 Buffer的基本原理 位置(position)、容量(capactiy)、上限(limit) Buffer的相关操作 1.Buffer的创建 //从堆中分配 ByteBuffer buffer = ByteBuffer.allocate(1024); //直接内存访问 ByteBuffer bu…
Java 异常
异常机制 异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。 异常处理的流程: 遇到错误,方法立即结束,并不返回一个值;同时,抛出一个异常对象 调用该方法的程序也不会继续执行下去,而是搜索一个可以处理该异常的异常处理器,并执行其中的代码 异常的分类 异常的分类: 异常的继承结构:基类为Thro…
【转】JVM 飙高排查脚本-结构分析
该文章来自于阿里巴巴技术协会(ATA)精选文章。 大家都有过遇到线上程序LOAD突然狂飙的场景,要排查到为何狂飙,我们当务之急就是要找到导致CPU飙升的原因。如果是进程级的应用,如Nginx、Apache等都还比较容易排查,但如果是JVM中的某个线程导致的,估计有人就要开始抓瞎了。 很多人都或多或少的知道有这么一个脚本,能帮你大致定位到现场导致LOAD飙升的JVM线程,脚本大概如下。 #!/bin…
【转】JVM性能调优监控工具
JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具,本博客希望能起抛砖引玉之用,让大家能开始对JVM性能调优的常用工具有所了解。 A、 jps(Java Virtual Machine Process Status Tool) jps主要用来输出JVM中运行的进程状态信…
JVM 设置
堆栈空间设置 -XX:+PrintGCDetails -Xms: 初始堆大小 -Xmx: 最大堆大小 -Xmn: 新生代大小 NewSize=MaxNewSize -XX:NewSize: 新生代初始堆大小 -XX:MaxNewSize: 新生代最大堆大小 -Xss: 线程栈大小 -XX:PermSize: 永久代(方法区)初始值 -XX:MaxPermSize: 永久代最大值 -XX:NewRa…
线程池 ThreadPoolExecutor
常用线程池 newFixedThredaPool 固定线程数量的线程池,改线程池中的线程数量始终不变。当有一个新任务提交时,若有空闲线程,则立即执行,否则会被暂存到一个任务队列中 newSingleThreadExecutor 只有一个线程的线程池 newCachedThreadPool 可根据实际情况调整线程数量的线程池。若有空闲线程可以复用,则优先使用,否则创建新线程。执行完毕后返回线程池复用…
Timer的缺陷
Timer管理延时任务的缺陷 Timer在执行定时任务时只会创建一个线程,所以如果存在多个任务,且任务时间过长,超过了两个任务的间隔时间,会发生一些缺陷。 Timer当任务抛出异常时的缺陷 如果TimerTask抛出RuntimeException,Timer会停止所有任务的运行。 Timer执行周期任务时依赖系统时间 Timer执行周期任务时依赖系统时间,如果当前系统时间发生变化会出现一些执行上…
java并发包
Java 并发包位于: java.util.concurrent ArrayBlockingQueue 定长阻塞队列 ConcurrentHashMap 高性能线程安全的HashMap,使用分段锁提供高能 ConcurrentLinkedQueue 高性能线程安全LinkedQueue,使用CAS操作代替锁提高性能 CopyOnWriteArrayList 线程安全的ArrayList,写时复制,…
Spring-技术内幕-IoC容器的实现
控制反转(Inversion of Control) 简单容器:BeanFactory 容器的高级形态:ApplicationContext Bean定义:BeanDefinition 定位(Resource) -> 载入、解析(BeanDefinitionReader、BeanDefinitionDocumentReader,创建BeanFactory) -> 注册(通过BeanDe…
[转]Java开发常用Linux命令
1. 查找文件 find / -name filename.txt 根据名称查找/目录下的filename.txt文件。 find . -name "*.xml" 递归查找所有的xml文件 find . -name "*.xml" |xargs grep "hello world" 递归查找所有文件内容中包含hello world的xml文件 grep -H 'spring' *.xml 查找所以…