摘要: 垃圾收集器 引用计数器: 从gc日志可以看出是回收了,java虚假没有选用引用计数器算法管理内存 可达性分析算法 ?线程池中线程是维持一个数量还是,用已经有的线程? 回收方法区 垃圾收集器 垃圾收集器根据应用场景和内存回收范围来选择。根据新生代、老年代,高性能服务器、客户端,计算密集场景、高响应场景。选择不同的收集器。 单线程收集器 单线程收集器,是使用单线程... 阅读全文
posted @ 2017-07-08 20:34 jiumao 阅读(208) 评论(0) 推荐(0) 编辑
摘要: 在Eclipse 配置运行参数或者在命令行中加上参数 eclipse 安装 MAT插件,使用。 虚拟机栈内存溢出: 创建很多线程导致内存溢出,可以减少最大堆和减少栈容量。 方法区和运行时常量池溢出 在jdk1.6中intern()方法会把首次遇到的字符串实例复制到永久代。而由StringBuilder创建的字符串实例在jav... 阅读全文
posted @ 2017-07-08 20:32 jiumao 阅读(268) 评论(0) 推荐(0) 编辑
摘要: 标记-清除 标记-清除算法是现代垃圾回收算法的思想基础。标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。一种可行的实现是,在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象 标记-整理 根据老年代的特点提出标记-整理算法。它在标记-清除算法的基础上做了一些优化。和标记-... 阅读全文
posted @ 2017-07-08 20:30 jiumao 阅读(115) 评论(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 阅读(100) 评论(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 阅读(104) 评论(0) 推荐(0) 编辑
摘要: 回收 对象回收 对象在不可达的情况下,如果对象覆盖finalize()方法,而且finalize()没有被调用过。这些对象会放置在F-Queue队列中,由Finalizer线程执行。由于是单线程,线程异常的情况导致线程不能执行下去也是可能的。 finalize()方法类似析构函数,在对象结束的时候会被调用。但这并不是推荐的使用方法。客观上,没有什么操作非得在这个时候执行。子类覆盖finaliz... 阅读全文
posted @ 2017-07-08 20:26 jiumao 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 对象的三种状态: 可达的 从根节点可以触及到这个对象 可复活的 一旦所有引用被释放,就是可复活状态 因为在finalize()中可能复活该对象 不可达的 在finalize()后,可能会进入不可触及状态 不可达的对象不可能复活 可以回收 引用标记 Java虚拟机提供自动内存管理机制。在GC中,没用的对象,内存是要回收的。如何高效判断对象存活是个重要的问题。 引用计数法 此算法计算... 阅读全文
posted @ 2017-07-08 20:25 jiumao 阅读(344) 评论(0) 推荐(0) 编辑
摘要: 对象内存布局 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。 对象头 HotSpot虚拟机的对象头包括两部分信息:运行时数据和类型指针。 运行时数据 用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。... 阅读全文
posted @ 2017-07-08 20:23 jiumao 阅读(134) 评论(0) 推荐(0) 编辑
摘要: 一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查、对象分配内存、并发处理、内存空间初始化、对象设置、执行ini方法等。 主要流程如下: 1. 类加载检查 JVM遇到一条new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行... 阅读全文
posted @ 2017-07-08 20:21 jiumao 阅读(132) 评论(0) 推荐(0) 编辑
摘要: 对象 Java虚拟机采用自动的内存管理和自适应的优化策略。但了解java虚拟机的运行机制和优化策略,写出适合java虚拟机管理的程序对性能提升是有意义的。 逃逸分析:对象的作用范围只在本线程范围,如方法(包括静态方法)中new 对象,这个对象是不可能被其它线程共享。可以直接在栈上分配内存。栈上数据在出栈后会释放内存,不需要GC回收。 大对象:虚拟机栈容量有限,大的对象会直接在堆上分配。堆内存回收频... 阅读全文
posted @ 2017-07-08 20:19 jiumao 阅读(112) 评论(0) 推荐(0) 编辑
摘要: 将博客搬至CSDN 阅读全文
posted @ 2017-07-08 19:47 jiumao 阅读(125) 评论(0) 推荐(0) 编辑
摘要: ThreadLocal源码分析 每个线程都保持对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。 线程局部变量。这些变量可以在不同的线程中独立初始化及赋值。线程局部变量 阅读全文
posted @ 2017-07-08 19:09 jiumao 阅读(97) 评论(0) 推荐(0) 编辑
摘要: 并发控制 CyclicBarrier CountDownLatch //模拟程序任务 场景一 测试程序 场景二 Semaphore Semaphore为并发包中提供用于控制某资源同时可以被几个线程访问的类 主要方法: void acquire() 从信号量获取一个许可,如果无可用许可前 将一直阻塞等待... 阅读全文
posted @ 2017-07-08 19:05 jiumao 阅读(127) 评论(0) 推荐(0) 编辑
摘要: 线程池 接口Executor 该接口只有一个方法,JDK解释如下 执行已提交的Runnable 任务的对象。此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。 不过,Executor 接口并没有严格地要求执行是异步的。在最简单的情况下,执行程序可以在调用者的线程中立即运行已提交的任务: 更常见的是,任务是在某个不... 阅读全文
posted @ 2017-07-08 18:22 jiumao 阅读(603) 评论(0) 推荐(0) 编辑
摘要: 队列(Queue) Queue: 先入先出(FIFO)的数据结构。 offer,add区别: 一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。 这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出 一个 unchecked 异常,而只是得到由 offer() 返回的 false。 poll,remove区别: remove() 和 p... 阅读全文
posted @ 2017-07-08 17:43 jiumao 阅读(207) 评论(0) 推荐(0) 编辑
摘要: 并发类库 在关注并发前,我们需要了解一些相关概念。 线程与进程 运行在系统上的每个程序都是一个进程。一个进程可包含多个线程。进程和线程都表示一个逻辑控制流,即一种计算过程。进程独立占用管理物理资源,线程共享同一个进程中的物理资源和数据。可以采用多进程来实现程序的并发。CPU资源是固定的,CPU通过多线程的切换实现并发。即线程轮流执行一个时间片,实现多个任务同时执行。 多线程使用要考虑用户交互与计... 阅读全文
posted @ 2017-07-08 17:40 jiumao 阅读(660) 评论(0) 推荐(0) 编辑
摘要: ReentrantLock重入锁 ReentrantLock是Java并发包中互斥锁,它有公平锁和非公平锁两种实现方式, 重入的意思就是,如果已经获得了锁,如果执行期间还需要获得这个锁的话,会直接获得所,不会被阻塞,获得锁的次数加1;每执行一次unlock,持有锁的次数减1,当为0时释放锁。这点,Synchronized 具有同样语义。 ... 阅读全文
posted @ 2017-07-08 17:01 jiumao 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 应该将子类定义为非公共内部帮助器类,一般并发包类用内部类Sync sync来继承并实现。为实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量、事件,等等)提供一个框架。此类的设计目标是成为依靠单个原子 int 值来表示状态的大多数同步器的一个有用基础。子类必须定义重写此状态的受保护方法,并定义哪种状态对于此对象意味着被获取或被释放。假定这些条件之后,此类中的其他方法就可以实现所... 阅读全文
posted @ 2017-07-08 16:36 jiumao 阅读(172) 评论(0) 推荐(0) 编辑
摘要: atomic 原子(atomic)本意是"不能被进一步分割的最小粒子",而原子操作(atomic operation)意为"不可被中断的一个或一系列操作"。在多处理器上实现原子操作就变得有点复杂。让我们一起来聊一聊在Intel处理器和Java里是如何实现原子操作的。 1.术语定义 在了解原子操作的实现原理前,先要了解一下相关的术语,如表2-7所示。 表2-7CPU术语定义 ... 阅读全文
posted @ 2017-07-08 14:57 jiumao 阅读(397) 评论(0) 推荐(0) 编辑
摘要: Synchronized 先来看下利用synchronized实现同步的基础:Java中的每一个对象都可以作为锁。具体表现 为以下3种形式。 ·对于普通同步方法,锁是当前实例对象。 ·对于静态同步方法,锁是当前类的Class对象。 ·对于同步方法块,锁是Synchonized括号里配置的对象。 synrhronized关键字简洁、清晰、语义明确,因此即使有了Lock... 阅读全文
posted @ 2017-07-08 14:34 jiumao 阅读(121) 评论(0) 推荐(0) 编辑