Java语言
doubel_山里娃
一个程序员的经历
展开
-
java volatile总结
当一个变量被定义成volatile 之后,它将具备以下几种特性:第一:第一是保证此变量对所有线程的可见性,这里的"可见性"是指当一条线程修改了这个变量,新值对于其他线程来说是可以立即得知的。而普通变量不能做到这一点,变量值在线程间传递均需要通过主内存来完成。在 java 垃圾回收整理一文中,描述了jvm运行时刻内存的分配。其中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个原创 2013-07-01 22:39:46 · 878 阅读 · 0 评论 -
双重检查锁定及单例模式
:本文在针对 Java 5.0 修订前参考了 Java 内存模型;关于内存排序的描述也许不再正确。尽管如此,在新的内存模型中,双重检查锁定习语仍旧是无效的。单例创建模式是一个通用的编程习语。和多线程一起使用时,必需使用某种类型的同步。在努力创建更有效的代码时,Java 程序员们创建了双重检查锁定习语,将其和单例创建模式一起使用,从而限制同步代码量。然而,由于一些不太常见的 Java 内存模转载 2013-06-27 01:37:10 · 669 阅读 · 0 评论 -
java语言的线程安全volatile用法
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。锁提供了两种主要特性转载 2013-06-27 01:29:32 · 904 阅读 · 0 评论 -
多线程切换以及线程进程之间关系
进程是资源拥有的单位。线程是调度的最小单位。又称为轻进程。他只拥有进程中一些资源,这次资源对于这个线程来说是必不可少的。而所有的线程共享进程的资源。因此不同的线程之间可以共享一些数据变量。而进程则不可以,因为不同进程有不同过的进程控制块,分别处于不同的屋里地址空间里面。每个线程都有自己的工作内存,也就是栈,如果从更底层的来说,相当于硬件的高速缓存,进程的一些公共资源常存放在堆中也就是主原创 2013-05-21 21:51:42 · 2097 阅读 · 0 评论 -
多线程 - 死锁
java 死锁的实现原理一句话:对象不能被其他线程来访问一步步分析来,对象要想不被其他线程访问,就是给对象加锁,这样其他线程就不可以访问了,但是怎么加锁呢?其实就是给当前线程访问的这个对象的这个方法加上同步块,这样,就加锁了。反过来推,已经有一个线程访问了当前对象的同步块,而对于同步块来说,一旦有线程进入,那么其他线程要想进入其他同步块,就必须获得这个对象锁,而一个对象只能有一个锁。原创 2013-05-12 08:57:08 · 851 阅读 · 0 评论 -
多线程-线程之间的通信
自我总结核心内容:线程之间的通信是通过具体对象来实现信息的交互的。而对象有wait和notafy方法,当一个线程调用了一个对象的wait方法,那么这个线程就处于暂停状态,如果另外一个线程调用了第一个线程对象的notify,那么含义就是说,我这个对象可以用了,那么所以调用我这个对象的线程,你们都可以继续执行你们的功能。但是需要注意,在线程waiti方法结束的时候,他必须要获得这个对象的锁,才可以退出原创 2013-05-11 03:26:24 · 791 阅读 · 0 评论 -
【IO】深入java NIO系列之缓冲区分析与源码解读
在进行NIO 缓冲区的介绍之前,我们需要理解以下概念:缓冲区操作进程执行IO操作,向操作系统发起请求,操作系统要么向缓冲区中写入数据,要么将缓冲区中的数据排干数据从磁盘移动到进程的内存区域整个过程:进程发起read()系统调用,要求其缓冲区被填满,内核随即要求磁盘控制硬件发送命令,磁盘控制器直接将数据写入内核的内存缓冲区中,该过程通过DMA来完成,无需主CPU协助,当磁盘控制器将内核缓冲区填满,内核随即将数据复制到进程对应缓冲区中。 这里涉及到内核空间和用户空间的概念内核空间:内核空原创 2020-11-24 08:47:02 · 139 阅读 · 0 评论 -
【MutiThread】【线程调度机制】
所谓多线程的并发运行,其实就是指各个线程轮流获得CPU的使用权,分别执行各自的任务。CPU的功能主要就是用于中断、内核以及用户进程处理,优先级分为中断>内核>用户进程,而线程何时获得CPU的使用权是由Java虚拟机说了算的。Java虚拟机的一项任务就是负责线程的调度。线程的调度是指按照特定的机制为多个线程分配CPU的使用权。有两种调度模型:1 分时调度模型2 抢占式调度模型。分时调度模型是让所有线程轮流获得CPU的使用权,并且平均分配每个线程占用的CPU的时间片。java虚拟机采用.原创 2020-11-25 08:46:17 · 186 阅读 · 0 评论 -
【MutiThread】【volatile关键字】
public class Client {private boolean stop = false;//没有volcatile标示private int num = 0;class A implements Runnable {public void run() { while (!stop) { num++; // System.out.println("aaaa");//打印一句话 //Thread.sleep(1000); //..原创 2020-11-25 08:47:03 · 92 阅读 · 0 评论 -
【JDK】【set接口】
概括此接口表示没有重复元素,且元素不保证顺序;此接口所以功能都是依据MAP接口下面数据结构来实现的;HashSet实现原理内部基于hashMap实现,利用hashMap的key不能重复来实现无重复元素功能;因此,hashSet相当于只键,值都是固定值,这个值定义为: Object PRESENT = new Object();特点元素不会重复;没有顺序;扩充了add方法,添加元素时候都会返回true或者false来表示是否有这个key值;TreeSet实现原理和ha原创 2020-11-25 08:48:09 · 75 阅读 · 0 评论 -
【JDK】【list接口】
概括数组:01234尾部头部栈:先进后出。只能在头部添加、删除、查看;单向队列:实现Queue接口。只能在尾部添加,头部只能查看和删除;双向队列:实现Deque接口即双端列表。尾部和头部都可以添加、删除、查看;arrayList底层是数组;linkedList底层是链表;ArrayDeque底层也是数组,并没底层是树的实现;ArrayList底层数据结构数组存取数据默认大小及扩容机制默认容量为10。没有奇偶限制。扩容:int newCapac原创 2020-11-25 08:48:22 · 87 阅读 · 0 评论 -
【IO】【文章摘录】
Java NIO原理图文分析及代码实现关于Java NIO的一些看法NIO与传统IO的区别java的io读写,缓冲区是如何提高读写效率的深入java NIO系列之缓冲区分析与源码解读深入分析 Java I/O 的工作机制原创 2020-11-25 08:48:31 · 78 阅读 · 0 评论 -
【JVM】【文章】
Java类加载器总结快速解读GC日志jvm的代码缓存耗尽导致性能下降原创 2020-11-17 08:53:44 · 48 阅读 · 0 评论 -
【JVM】【日志】Thread Dump 日志分析
jstack Dump 日志文件中的线程状态dump 文件里,值得关注的线程状态有:死锁,Deadlock(重点关注)执行中,Runnable等待资源,Waiting on condition(重点关注)等待获取监视器,Waiting on monitor entry(重点关注)暂停,Suspended对象等待中,Object.wait() 或 TIMED_WAITING阻塞,Blocked(重点关注)停止,Parked日志格式:[外链图片转存失败,源站可能有防盗链机制,建议将图片保原创 2020-11-17 08:52:49 · 688 阅读 · 0 评论 -
【JVM】【日志】Thread Dump 分析综述
一、Thread Dump介绍1.1什么是Thread Dump?Thread Dump是非常有用的诊断Java应用问题的工具。每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能力,虽然各个 Java虚拟机打印的thread dump略有不同,但是大多都提供了当前活动线程的快照,及JVM中所有Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名及所执行的方法,如果可能的话还有源代码的行数。1.2 Thread Dump特点能在各种操作系统下使用能在各种Java应用原创 2020-11-17 08:50:35 · 699 阅读 · 0 评论 -
【JVM】【日志】【解读GC日志】
Parallel Scavenge 和Parallel Old 收集器日志第一次GC2017-03-21T22:44:13.115+0800: 2.192:[GC[PSYoungGen: 98304K->16367K(114688K)]98304K->27259K(125632K), 0.0327436 secs] [Times: user=0.08 sys=0.00, real=0.03 secs]第二次GC2017-03-21T22:44:13.148+0800: 2.225原创 2020-11-17 08:50:02 · 284 阅读 · 0 评论 -
【JVM】【日志】【Thread Dump线程状态转换】
2.1 新建状态(New)用new语句创建的线程处于新建状态,此时它和其他Java对象一样,仅仅在堆区中被分配了内存。2.2 就绪状态(Runnable)当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态,Java虚拟机会为它创建方法调用栈和程序计数器。处于这个状态的线程位于可运行池中,等待获得CPU的使用权。2.3 运行状态(Running)处于这个状态的线程占用CPU,执行程序代码。只有处于就绪状态的线程才有机会转到运行状态。2.4 阻塞状态(Blocked),.原创 2020-11-17 08:49:24 · 82 阅读 · 0 评论 -
【JVM】【内存】内存分布
虚拟机的内存模型就如上图:深色部分是多个线程共享的,浅色部分是各个线程独享的方法区存放内容:存放着已经被虚拟机加载的类的信息,包括类信息(名称、修饰符等)、类中的field常量、静态变量等,当程序中通过class对象的getName,isinterface等方法获取信息时,这些数据都来源于方法区域;描述:虽然常说把方法区归为堆的一部分,但他也有一个名字叫做非堆,目的是为了与堆区分开来;参数配置:默认大小是16MB,最大为64MB,可以通过-XX:PermSize及-XX:MaxPermSize来指.原创 2020-11-17 08:48:14 · 59 阅读 · 0 评论 -
【JVM】【命令】各命令使用组合方式
JVM虚拟机监控有三个维度:监控线程的执行状态:jstack同样需要利用jps命令来得到进程PID;执行 jstack -l PID 来显示此刻,各个线程状态,当然,也可以利用管道命令把相关内容移到另外一个文件里面,方便查看,例如 jstack -l pid >thread.log监控JVM垃圾回收、内存使用情况:jstat同样利用jps -l 来获取到需要监控的JVM进程的PID;然后执行 jstat -gcutil 2540 2000 20 ,意思是:统计进程号为2540,每隔原创 2020-11-17 08:46:40 · 135 阅读 · 0 评论 -
【JVM】【类加载器】加载过程
1、什么时候类需要被初始化?(1)、使用new关键字创建对象;(2)、读取或者设置一个静态字段(包括静态变量和静态语句块,被finial修饰,已经在编译期放入常量池的静态字段除外。注意,)(3)、调用一个静态方法(4)、反射访问一个类的时候,如果没有初始化,需要被初始化(5)、初始化一个类的时候,如果父类没有被初始化,需要先初始化父类(6)、虚拟机启动,main方法的类需要先被初始化(7)初始化,虚拟机会自动生成方法,然后自动执行,所有的初始化操作都在这个方法里面完成。2、加载过程(1)、原创 2020-11-17 08:46:08 · 91 阅读 · 0 评论 -
【JVM】【类加载器】【总结】
概念加载class文件的字节内容,转换为虚拟机可识别的内容;类的加载是动态的,即在运行时需要的时候才会被加载;对于hotshot虚拟机,加载class文件字节流到方法区,同时在方法去创建一个class对象,这个对象作为类对象访问的入口;类唯一性:同一个类只有被同一个类加载器加载了,这两个类才算相等;每一个类加载器,都有一个独立的类名称空间,彼此相互隔离,互补干涉;当加载器需要加载一个类时候,先看自己类名称空间是否有该class对象,如果没有则加载,否则不会再加载;因此,如果不同的几个类加载器,去原创 2020-11-17 08:45:37 · 107 阅读 · 0 评论 -
【JVM】【类加载器】【机制】
参考文章:http://blog.csdn.net/cxhzqhzq/article/details/6686121http://www.cnblogs.com/javaee6/p/3714716.html类加载代理机制类加载器在尝试自己去查找某个类的字节代码并定义它时,会先代理给其父类加载器,由父类加载器先去尝试加载这个类,依次类推,这种方式称为代理模型。在介绍代理模式背后的动机之前,首先需要说明一下 Java 虚拟机是如何判定两个 Java 类是相同的。Java 虚拟机不仅要看类的全名是否相同原创 2020-11-17 08:44:59 · 52 阅读 · 0 评论 -
【JVM】【类加载器】【OSGI】
现在越来越多的Java开发人员在谈论OSGi是有其道理的。在几年前上学的时候我进行了比较多的Eclipse插件开发,当时就亲身感觉到Eclipse插件体系的灵活与强大,而该体系与OSGi也可谓一脉相承、同气连枝。最近打算重新系统的研究一下OSGi,一边学习一边写一个OSGi探秘系列作为总结,和大家分享,也请大家多给评价和建议。在这一篇里面,我想先回答一个基本的问题:什么是OSGi?其实如果要很好地回答这个问题,也许先明白是什么导致了OSGi的产生和发展会有些帮助。相信每个Java程序员都知道Classp原创 2020-11-16 21:01:57 · 178 阅读 · 0 评论 -
【JVM】【概念】【垃圾回收算法】
1、引用计数收集器任何时刻计数器都为0的对象就是不可能再被使用的。但是Java语言中没有选用引用计数算法来管理内存,其中最主要的原因是它很难解决对象之间的相互循环引用的问题。举个简单的例子,对象objA和objB都有字段instance,赋值令objA.instance = objB及objB.instance = objA,除此之外,这两个对象再无引用,实际上这两个对象已经不可能再被访问,理论上是应该被回收掉的,但是因为它们互相引用着对方,导致它们的引用计数都不为0,于是引用计数算法无法通知GC收集器原创 2020-11-16 20:57:24 · 45 阅读 · 0 评论 -
【JVM】【调优案例】案例
高性能硬件程序部署策略参数配置-Xmx 和-Xms设定为12G 64位系统现象经常不定期出现长时间无响应原因GC导致的系统停顿高性能硬件通用部署方式两种64位JDK来使用大内存。对于32为OS,理论上地址总线寻址为2的32次方即4G,但是通常OS会分用户空间和系统空间各占2G,因此,32位OS理论上最大的堆内存为2G;但是由于64位占用更大的内存因此DUMP文件会超级大,另外性能也没有32位的好,因此,采用第二种方式利用若干个32虚拟机建立逻辑集群,利用硬件资源。处理方案采用5原创 2020-11-16 20:56:27 · 88 阅读 · 0 评论 -
【JVM】【调优】【总结】
开发人员调优考虑哪些?调优思路依据业务系统选择不同的垃圾收集器组合。如果对响应比较关心,则选择CMS老年代收集器,他会降低垃圾收集时候响应停顿;如果对吞吐量比较关心,则可以选择ParallerOld吞吐量收集器。例如本身10ms收集一次,每次停顿100MS,现在用CMS之后,5ms收集一次,每次停顿70ms,这样110ms第一种处理了10ms业务,CMS处理时间小于10ms,停顿时间确实少了,但是吞吐量也降下来了。这里需要注意,如果CMS收集器5ms处理时间是50ms那岂不是和吞吐量收集器一样的效果了原创 2020-09-20 14:34:27 · 52 阅读 · 0 评论 -
java 虚拟机内存总结
1、程序计数器是线程私有的,每一个线程都有属于自己的一个程序计数器,程序计数器的作用就是记录当前线程执行字节码的指令地址,也正是因为每一个线程都有自己的程序计数器,所以在线程切换的时候才可以正确的知道自己线程上次执行的指令地址2、栈。也是线程私有的,每一个方法在运行的时候虚拟机都会为他创建一个栈指针,一个方法从开始执行到执行结束,也是一个栈指针从入站到出栈的过程,这个指针为什么能确定呢?因此再...原创 2013-07-09 23:36:35 · 763 阅读 · 0 评论 -
java垃圾回收器之跟搜索算法
判断对象已经死。不能通过引用计数算法,因为他无法解决对象之间相互循环引用的关系。如果两个对象彼此相互引用,但是在以后再也没用,那么岂不是浪费了空间,导致对象无法回收,通常是采用跟搜索算法,以一系列名为“GV Roots”的对象作为起始点,当一个对象到GC root没有任何引用链引用的时候,则表示这个对象可以被回收。可以作为GC root的对象有下面几种情况:第一:虚拟机栈中引用的对象,也就是方法...原创 2013-07-11 23:48:19 · 721 阅读 · 0 评论 -
java类和类加载器
虚拟机类加载器机制Java虚拟机把class二进制类文件加载到内存中,然后经过连接、初始化,当然连接分为好几个部分,最终形成虚拟机可以直接使用的java类型语言,这就是虚拟机的类加载机制。Java语言和其他一些语言不太相同,java类的加载和连接过程都是程序运气期间完成的,这样虽然在加载过程中需要一些额外的连接功能实现,增加了系统的开销,但是却极大的增强了java的灵活性,java之所以成...原创 2013-08-08 02:48:15 · 962 阅读 · 0 评论 -
Java虚拟机内存溢出测试
VM运行时数据区域JVM执行Java程序的过程中,会使用到各种数据区域,这些区域有各自的用途、创建和销毁时间。根据《Java虚拟机规范(第二版)》(下文称VM Spec)的规定,JVM包括下列几个运行时数据区域: 1.程序计数器(Program Counter Register): 每一个Java线程都有一个程序计数器来用于保存程序执行到当前方法的哪一个指令,对于非Native...转载 2013-11-15 02:49:18 · 958 阅读 · 0 评论 -
java垃圾回收之Minor GC和Major GC
深入理解Java虚拟机:JVM高级特性与最佳实践 对Minor GC和Major GC做点笔记 新生代 GC(Minor GC):指发生在新生代的垃圾收集动作,因为 Java 对象大多都具 备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。 老年代 GC(Major GC / Full GC):指发生在老年代的 GC,出现了 Major GC,...转载 2013-11-15 02:56:25 · 1068 阅读 · 0 评论 -
什么是内存泄漏
mportNew注:如果你也对Java技术翻译分享感兴趣,欢迎加入我们的 Java开发 小组。参与方式请查看小组简介。Java最显著的优势之一就是它的内存管理机制。你只需简单创建对象,然后Java垃圾回收机制便会小心的分配和释放内存。然而,事实并非如此简单,因为在Java应用程序中经常发生内存泄漏。本教程说明了什么是内存泄漏,为什么会发生,以及如何防止它们。1.什么是内存泄漏?内存...转载 2014-01-19 03:16:17 · 602 阅读 · 0 评论 -
【集合】comparable接口与comparator
作用:这两个接口可以实现对类对象的集合进行排序 comparable接口:一个类实现此接口,并实现其中的接口方法,那么对这个类对象的集合进行排序时候,就可以把此comparable作为默认的比较方法,进行自定义的升序或者降序集合排列; 现在情况出现改变,例如对于实现comparable的bean对象,其他地方可能需要按照此对象的另外几个属性信息进行排序,而不采用他默认的排序方式...原创 2013-08-10 14:32:19 · 781 阅读 · 0 评论 -
深克隆与浅克隆
产生深克隆与浅克隆的原因是调用clone()方法,对于引用类型变量,克隆出来的对象,克隆的是引用地址,所以在克隆出来对象里面对这些引用类型变量,进行修改,会影响先前的对象数据。下面直接贴出代码,需要注意两点:clone方法的实现,需要注意,因为Object的clone方法是Project的类型,所以要想在外面调用clone方法,必须重写;第二点:就是深拷贝,就是对象实现序列化接口,然后通过字节...原创 2013-08-10 15:12:26 · 741 阅读 · 0 评论 -
【集合】JDK源码类图
集合类图转载 2017-03-28 22:18:52 · 1167 阅读 · 0 评论 -
java 内存分配 详解
Java 内存分配Java 程序运行时的内存结构分成:方法区、栈内存、堆内存、本地方法栈几种。栈和堆都是数据结构的知识,如果不清楚,没有关系,就当成一个不同的名字就好了,下面的讲解不需要用到它们具体的知识。1:方法区方法区存放装载的类数据信息包括:(1):基本信息:1)每个类的全限定名2)每个类的直接超类的全限定名(可约束类型转换)3)该类是类还是接口4)该类型的访问修饰符5)直接超接口的全限...转载 2013-05-21 21:50:12 · 701 阅读 · 0 评论 -
java 内存分布
首先明白,java创建一个对象,就是分配一块内存区域,然后把这个对象的一些具体信息,存放在这个区域里面。 虚拟机会把计算机中的许多内存管理起来。相当于一个大管家,不同的区域也有不同的应用。因此,也就构成了java的内存分配区域。第一种:寄存器。由于寄存器位于cpu内部,他的存取速度是最快的。当然,如果把对象存放在寄存器里面,这样对象的访问速度当然是最高的。但是只是我们一相情愿,对于寄存器的内...原创 2013-05-21 21:48:20 · 749 阅读 · 0 评论 -
【IO】【java的io读写,缓冲区是如何提高读写效率的】
据我了解,运用FileInputStream读写一段数据是一个字节一个字节的读取,如果有10个字节大小的文件,就要调用10次系统调用,每次将读取的数据赋值给变量,然后程序使用变量。缓冲区可以看作是一个放在内存中的数组,但是从硬盘中读取数据仍然要使用系统调用,系统调用的读取仍然是每次一个,只是每调用一次之后,将所得到的数据放入缓冲区中的,然后程序一次性使用10个数据。我是这样理解的,但是不管用与...原创 2019-02-11 16:43:52 · 1335 阅读 · 0 评论 -
【IO】【Nio和IO内存交互图】
d:文件描述符的意思 需要了解几个概念: 文件描述符:也就是图上的fd,暂且可以理解为一个文件描述符对应一个socket,例如同一主机多个客户端访问同一个端口号的服务端,由于他们都来于同一个ip地址,也就是tcp的数据包,来自同一个地方,那么服务端是如何区分这些不同不通的socket呢?就是通过文件描述符来确定,这样 才可以保证数据的正确性。在传递文件描述符的时候,会传递相...原创 2019-02-11 16:39:09 · 375 阅读 · 0 评论 -
【IO】【NIO】【类图】
以上是NIO的代码以及类图,对于NIO需要了解以下几点:1、一个channel就是一个连接操作,既然操作就需要文件描述符fd,所以无论是severSokcetChnel还是socketChinel他们在创建时候都会创建一个文件描述符;2、chanel都会设置需要操作那些事件,需要注意的是,对于serversocketChannel监听的是接受新...原创 2019-02-11 16:35:02 · 326 阅读 · 0 评论