摘要: 垃圾收集器 引用计数器: 从gc日志可以看出是回收了,java虚假没有选用引用计数器算法管理内存 可达性分析算法 ?线程池中线程是维持一个数量还是,用已经有的线程? 回收方法区 垃圾收集器 垃圾收集器根据应用场景和内存回收范围来选择。根据新生代、老年代,高性能服务器、客户端,计算密集场景、高响应场景。选择不同的收集器。 单线程收集器 单线程收集器,是使用单线程... 阅读全文
posted @ 2017-07-08 20:34 jiumao 阅读(220) 评论(0) 推荐(0)
摘要: 在Eclipse 配置运行参数或者在命令行中加上参数 eclipse 安装 MAT插件,使用。 虚拟机栈内存溢出: 创建很多线程导致内存溢出,可以减少最大堆和减少栈容量。 方法区和运行时常量池溢出 在jdk1.6中intern()方法会把首次遇到的字符串实例复制到永久代。而由StringBuilder创建的字符串实例在jav... 阅读全文
posted @ 2017-07-08 20:32 jiumao 阅读(275) 评论(0) 推荐(0)
摘要: 标记-清除 标记-清除算法是现代垃圾回收算法的思想基础。标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。一种可行的实现是,在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象 标记-整理 根据老年代的特点提出标记-整理算法。它在标记-清除算法的基础上做了一些优化。和标记-... 阅读全文
posted @ 2017-07-08 20:30 jiumao 阅读(121) 评论(0) 推荐(0)
摘要: 如果了解java虚拟机更系统的操作。请阅读 Charlie Hunt , Binu John著《java性能优化权威指南》,James Gosling,Java之父、Steve Wilson,Oracle公司工程副总裁写序。 Java虚拟机运行时数据区: PC寄存器(程序计数器):program counter线程私有的较小的内存空间,保存当前线程所执行的字节码指令地址。在虚拟机概念模型里... 阅读全文
posted @ 2017-07-08 20:29 jiumao 阅读(117) 评论(0) 推荐(0)
摘要: 内存自动管理20 内存模型20 Jvm垃圾收集算法22 标记-清除22 标记-整理22 复制算法22 分代思想23 Stop-The-World23 java堆溢出:24 方法区和运行时常量池溢出27 本机直接内存溢出29 垃圾收集器30 引用计数器:... 阅读全文
posted @ 2017-07-08 20:28 jiumao 阅读(110) 评论(0) 推荐(0)
摘要: 回收 对象回收 对象在不可达的情况下,如果对象覆盖finalize()方法,而且finalize()没有被调用过。这些对象会放置在F-Queue队列中,由Finalizer线程执行。由于是单线程,线程异常的情况导致线程不能执行下去也是可能的。 finalize()方法类似析构函数,在对象结束的时候会被调用。但这并不是推荐的使用方法。客观上,没有什么操作非得在这个时候执行。子类覆盖finaliz... 阅读全文
posted @ 2017-07-08 20:26 jiumao 阅读(166) 评论(0) 推荐(0)
摘要: 对象的三种状态: 可达的 从根节点可以触及到这个对象 可复活的 一旦所有引用被释放,就是可复活状态 因为在finalize()中可能复活该对象 不可达的 在finalize()后,可能会进入不可触及状态 不可达的对象不可能复活 可以回收 引用标记 Java虚拟机提供自动内存管理机制。在GC中,没用的对象,内存是要回收的。如何高效判断对象存活是个重要的问题。 引用计数法 此算法计算... 阅读全文
posted @ 2017-07-08 20:25 jiumao 阅读(361) 评论(0) 推荐(0)
摘要: 对象内存布局 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。 对象头 HotSpot虚拟机的对象头包括两部分信息:运行时数据和类型指针。 运行时数据 用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。... 阅读全文
posted @ 2017-07-08 20:23 jiumao 阅读(139) 评论(0) 推荐(0)
摘要: 一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查、对象分配内存、并发处理、内存空间初始化、对象设置、执行ini方法等。 主要流程如下: 1. 类加载检查 JVM遇到一条new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行... 阅读全文
posted @ 2017-07-08 20:21 jiumao 阅读(144) 评论(0) 推荐(0)
摘要: 对象 Java虚拟机采用自动的内存管理和自适应的优化策略。但了解java虚拟机的运行机制和优化策略,写出适合java虚拟机管理的程序对性能提升是有意义的。 逃逸分析:对象的作用范围只在本线程范围,如方法(包括静态方法)中new 对象,这个对象是不可能被其它线程共享。可以直接在栈上分配内存。栈上数据在出栈后会释放内存,不需要GC回收。 大对象:虚拟机栈容量有限,大的对象会直接在堆上分配。堆内存回收频... 阅读全文
posted @ 2017-07-08 20:19 jiumao 阅读(116) 评论(0) 推荐(0)
摘要: 将博客搬至CSDN 阅读全文
posted @ 2017-07-08 19:47 jiumao 阅读(128) 评论(0) 推荐(0)
摘要: ThreadLocal源码分析 每个线程都保持对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。 线程局部变量。这些变量可以在不同的线程中独立初始化及赋值。线程局部变量 阅读全文
posted @ 2017-07-08 19:09 jiumao 阅读(103) 评论(0) 推荐(0)
摘要: 并发控制 CyclicBarrier CountDownLatch //模拟程序任务 场景一 测试程序 场景二 Semaphore Semaphore为并发包中提供用于控制某资源同时可以被几个线程访问的类 主要方法: void acquire() 从信号量获取一个许可,如果无可用许可前 将一直阻塞等待... 阅读全文
posted @ 2017-07-08 19:05 jiumao 阅读(138) 评论(0) 推荐(0)
摘要: 线程池 接口Executor 该接口只有一个方法,JDK解释如下 执行已提交的Runnable 任务的对象。此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。 不过,Executor 接口并没有严格地要求执行是异步的。在最简单的情况下,执行程序可以在调用者的线程中立即运行已提交的任务: 更常见的是,任务是在某个不... 阅读全文
posted @ 2017-07-08 18:22 jiumao 阅读(613) 评论(0) 推荐(0)
摘要: 队列(Queue) Queue: 先入先出(FIFO)的数据结构。 offer,add区别: 一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。 这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出 一个 unchecked 异常,而只是得到由 offer() 返回的 false。 poll,remove区别: remove() 和 p... 阅读全文
posted @ 2017-07-08 17:43 jiumao 阅读(222) 评论(0) 推荐(0)
摘要: 并发类库 在关注并发前,我们需要了解一些相关概念。 线程与进程 运行在系统上的每个程序都是一个进程。一个进程可包含多个线程。进程和线程都表示一个逻辑控制流,即一种计算过程。进程独立占用管理物理资源,线程共享同一个进程中的物理资源和数据。可以采用多进程来实现程序的并发。CPU资源是固定的,CPU通过多线程的切换实现并发。即线程轮流执行一个时间片,实现多个任务同时执行。 多线程使用要考虑用户交互与计... 阅读全文
posted @ 2017-07-08 17:40 jiumao 阅读(667) 评论(0) 推荐(0)
摘要: ReentrantLock重入锁 ReentrantLock是Java并发包中互斥锁,它有公平锁和非公平锁两种实现方式, 重入的意思就是,如果已经获得了锁,如果执行期间还需要获得这个锁的话,会直接获得所,不会被阻塞,获得锁的次数加1;每执行一次unlock,持有锁的次数减1,当为0时释放锁。这点,Synchronized 具有同样语义。 ... 阅读全文
posted @ 2017-07-08 17:01 jiumao 阅读(174) 评论(0) 推荐(0)
摘要: 应该将子类定义为非公共内部帮助器类,一般并发包类用内部类Sync sync来继承并实现。为实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量、事件,等等)提供一个框架。此类的设计目标是成为依靠单个原子 int 值来表示状态的大多数同步器的一个有用基础。子类必须定义重写此状态的受保护方法,并定义哪种状态对于此对象意味着被获取或被释放。假定这些条件之后,此类中的其他方法就可以实现所... 阅读全文
posted @ 2017-07-08 16:36 jiumao 阅读(177) 评论(0) 推荐(0)
摘要: atomic 原子(atomic)本意是"不能被进一步分割的最小粒子",而原子操作(atomic operation)意为"不可被中断的一个或一系列操作"。在多处理器上实现原子操作就变得有点复杂。让我们一起来聊一聊在Intel处理器和Java里是如何实现原子操作的。 1.术语定义 在了解原子操作的实现原理前,先要了解一下相关的术语,如表2-7所示。 表2-7CPU术语定义 ... 阅读全文
posted @ 2017-07-08 14:57 jiumao 阅读(419) 评论(0) 推荐(0)
摘要: Synchronized 先来看下利用synchronized实现同步的基础:Java中的每一个对象都可以作为锁。具体表现 为以下3种形式。 ·对于普通同步方法,锁是当前实例对象。 ·对于静态同步方法,锁是当前类的Class对象。 ·对于同步方法块,锁是Synchonized括号里配置的对象。 synrhronized关键字简洁、清晰、语义明确,因此即使有了Lock... 阅读全文
posted @ 2017-07-08 14:34 jiumao 阅读(127) 评论(0) 推荐(0)
摘要: volatile 在多线程并发编程中synchronized和volatile都扮演着重要的角色,volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的"可见性"。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。如果volatile变量修饰符使用恰当的话,它比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调... 阅读全文
posted @ 2017-07-08 14:25 jiumao 阅读(142) 评论(0) 推荐(0)
摘要: 锁 对象头(Object Header) HotSpot 虚拟机的对象头包括两部分信息:Mark Word(标记字段)和 Klass Pointer(类型指针) Mark Word 用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等等。JVM 对象头一般占用两个机器码,在 32-bit JVM 上占用 64b... 阅读全文
posted @ 2017-07-08 14:10 jiumao 阅读(905) 评论(0) 推荐(0)
摘要: 一致性 内存模型 每一个线程有一个工作内存和主存独立 工作内存存放主存中变量的值的拷贝 Happen Before 1、程序次序规则:在一个单独的线程中,按照程序代码的执行流顺序,(时间上)先执行的操作happen—before(时间上)后执行的操作。 2、管理锁定规则:一个unlock操作happen—before后面(时间上的先后顺序,下... 阅读全文
posted @ 2017-07-08 13:51 jiumao 阅读(4453) 评论(0) 推荐(0)
摘要: String应用简介 前言 String字符串在Java应用中使用非常频繁,只有理解了它在虚拟机中的实现机制,才能写出健壮的应用,本文使用的JDK版本为1.8.0_111。 常量池 Java代码被编译成class文件时,会生成一个常量池(Constant pool)的数据结构,用以保存字面常量和符号引用(类名、方法名、接口名和字段名等)。 很简单的一段代码,通过命令 javap ... 阅读全文
posted @ 2017-07-08 13:39 jiumao 阅读(224) 评论(0) 推荐(0)
摘要: 内省(Introspector)是Java 语言对Bean类属性、事件的一种缺省处理方法。JDK提供了对JavaBean进行操作的API,这套API就称为内省。 Java的内省是指在不知道Bean对象的属性的情况下,通过Introspector和属性描述器(PropertyDescriptor)来获取属性的getter/setter方法。 Java内省机制的一般做法是通过类... 阅读全文
posted @ 2017-07-08 13:03 jiumao 阅读(160) 评论(0) 推荐(0)
摘要: 每个Java class在jvm中都有一个对应对象描述。每个Java对象都有一个只想class的指针。反射的实质获取对象指向Class元数据描述的信息,详见java.lang.class类。反射通过class对类的描述可以获取类field、method、包括匿名类和内部类等所有类定义的信息。下面详细介绍反射的实现: 1.先检查 AccessibleObject的override属性... 阅读全文
posted @ 2017-07-08 12:57 jiumao 阅读(192) 评论(0) 推荐(0)
摘要: 注解 运行 Sun JDK字节码生成分为三个阶段: 解析和填充符号表过程,生成语法树 插入式注解处理器的注解处理过程,可以操作语法树。 这个操作语法树的特性,可以让注解生成代码或者填充默认值 Google的AutoValue值类型生成类库 分析与字节码生成。 作用阶段: 枚举类型 java.lang.annotation.RetentionPoli... 阅读全文
posted @ 2017-07-08 12:36 jiumao 阅读(198) 评论(0) 推荐(0)
摘要: 类加载器 前提:通过一个类的全限定名来获取描述此类的二进制字节流,实现这个动作的代码模块称为类加载器。这里并没有规定读取方式,可以从Class文件、网络、数据库、内存等。比较两个类是否相等,需要两个类来源于同一个Class文件,被同一个类加载器加载。 Java有两种类加载器。Java虚拟机用c++语言实现的启动类加载器(Bootstrap ClassLoader)。Java语言的其它类加载... 阅读全文
posted @ 2017-07-08 12:32 jiumao 阅读(125) 评论(0) 推荐(0)
摘要: 一个序列化例子 Test.java 包括一个无参构造器,一个序列化的属性和不被序列化的属性。 定义序列化的工具方法 序列化 反序列化 测试(反序列化的本质是对象的深克隆,不会走构造方法) 阅读全文
posted @ 2017-07-08 12:31 jiumao 阅读(97) 评论(0) 推荐(0)
摘要: 其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该 地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思。再如我们有的时候打官司,我们需要请律师,因为律师在法律方面有 专长,可以替我们进行操作,表达我们的想法。先来看看关系图: 代理模式的应用场景:... 阅读全文
posted @ 2017-07-08 12:30 jiumao 阅读(155) 评论(0) 推荐(0)
摘要: 语法糖 Java语法糖系列,所以首先讲讲什么是语法糖。语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这些语法做一些处理,开发者就可以直接方便地使用了。这些语法糖虽然不会提供实质性的功能改进,但是它们或能 阅读全文
posted @ 2017-07-08 12:12 jiumao 阅读(3357) 评论(0) 推荐(0)