Java虚拟机/Java多线程
坦GA
积沙成塔
展开
-
JVM调优——Java动态编译过程中的内存溢出问题
原文地址:https://blog.csdn.net/moneyshi/article/details/81512017由于测试环境项目每2小时内存就溢出一次, 分析问题,发现Java动态加载Class并运行那块存在内存溢出问题, 遂本地调测。一、找到动态编译那块的代码,具体如下/*** @MethodName : 编译java代码到Object* @Description...转载 2018-08-09 10:00:46 · 842 阅读 · 0 评论 -
Java原子变量类
以下是对《java并发编程实战》一书中相关部分的总结,加深自己的印象。 原子变量比锁的粒度更细,量级更轻,并且对于在多处理器系统上实现高性能的并发代码来说是非常关键的。原子变量将发生竞争的范围缩小到单个变量上,这是你获得的粒度最细的情况(假设算法能够基于这种细粒度来实现)。更新原子变量的快速(非竞争)路径不会比获取锁的快速路径慢,并且通常会更快,而它的慢速路径肯定比锁的慢速路径快,因为它原创 2016-08-14 17:39:29 · 3655 阅读 · 0 评论 -
Java加锁机制
下列代码不是线程安全的,该Servlet在没有足够原子性保证的情况下对其最近计算结果进行缓存(不要这样做)@NotThreadSafepublic class UnsafeCachingFactorizer implements Servlet{ private final AtomicReference lastNumber = new AtomicReference(); priva原创 2016-08-19 21:04:12 · 731 阅读 · 0 评论 -
Java如何判断线程池中所有任务执行完毕
原文地址:http://blog.csdn.net/truong/article/details/40227435public class Test { public static void main(String args[]) throws InterruptedException { ExecutorService exe = Executor转载 2016-10-08 15:18:06 · 5623 阅读 · 2 评论 -
Java多线程等待所有线程结束(CountDownLatch/CyclicBarrier)
原文地址:https://software.intel.com/zh-cn/blogs/2013/10/15/java-countdownlatchcyclicbarrier/?utm_campaign=CSDN&utm_source=intel.csdn.net&utm_medium=Link&utm_content=others-%20Java本文主要是转载 2016-10-08 16:20:55 · 4366 阅读 · 0 评论 -
Java中对象锁和类锁举例
原文地址:http://www.cnblogs.com/cangqiongbingchen/p/5806757.html Java的锁分为对象锁和类锁。 1. 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内针对该对象的操作只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。 2转载 2016-10-08 17:50:02 · 2595 阅读 · 0 评论 -
互斥锁和读写锁的区别
原文地址:相交进程之间的关系主要有两种,同步与互斥。所谓互斥,是指散步在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它 们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。所谓同步,是指散步在不同进程之间的若干程序片断,它们的运行必须严格按照规定的 某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。 显然,同步是一种转载 2016-10-09 11:45:13 · 15216 阅读 · 1 评论 -
Java中ThreadLocal介绍
原文地址:http://www.cnblogs.com/dolphin0520/p/3920407.html 想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场景。一.对转载 2016-10-09 18:47:25 · 512 阅读 · 0 评论 -
Thread和Runnable的区别
原文地址:http://blog.csdn.net/wwww1988600/article/details/7309070在Java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此转载 2016-10-11 17:51:18 · 515 阅读 · 0 评论 -
Java中等待所有线程都执行结束
原文地址:http://blog.csdn.net/liweisnake/article/details/12966761 今天看到一篇文章,是关于java中如何等待所有线程都执行结束,文章总结得很好,原文如下http://software.intel.com/zh-cn/blogs/2013/10/15/java-countdownlatchcyclicbarrier/?utm_cam转载 2016-10-08 15:49:49 · 651 阅读 · 0 评论 -
Java中自旋锁介绍
原文地址:http://blog.csdn.net/sunp823/article/details/49886051一、自旋锁的概念首先是一种锁,与互斥锁相似,基本作用是用于线程(进程)之间的同步。与普通锁不同的是,一个线程A在获得普通锁后,如果再有线程B试图获取锁,那么这个线程B将会挂起(阻塞);试想下,如果两个线程资源竞争不是特别激烈,而处理器阻塞一个线程引起的线程上下文的切换的代转载 2016-10-07 21:31:17 · 676 阅读 · 0 评论 -
如何终止Java线程
原文地址:http://blog.csdn.net/anhuidelinger/article/details/11746365 终止线程的三种方法 有三种方法可以使终止线程。 1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。 2. 使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、转载 2016-10-02 11:03:09 · 2716 阅读 · 0 评论 -
Java多线程Concurrent包内容介绍
原文地址:http://www.open-open.com/bbs/view/1320131360999我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便。而当针对高质量Java多线程并发程序设计时,为防止死蹦等现象的出现,比如使用java之前的wait()、not转载 2016-10-02 10:22:52 · 477 阅读 · 0 评论 -
Java硬件对并发的支持
独占锁是一项悲观技术--它假设最坏的情况(如果不锁门,那么捣蛋鬼就会闯入并搞的一团糟),并且只有在确保其它线程不会造成干扰(通过获取正确的锁)的情况下才能执行下去。在早期的处理器中支持原子的测试并设置(Test-and-Set),获取并递增(Fetch-and-Increment)以及交换(Swap)等指令。这些命令足以实现各种互斥体,而这些互斥体又可以实现一些更复杂的并发对象。现在,几乎所有原创 2016-08-14 14:36:24 · 981 阅读 · 0 评论 -
Java并发编程:线程池的使用
以下内容为转自其它博客Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可转载 2016-08-08 23:01:09 · 580 阅读 · 0 评论 -
Java并发编程中并发容器ConcurrentHashMap和CopyOnWriteArrayList
JDK 5 中加入的ConcurrentHashMap:用来替代同步且基于散列的MapCopyOnWriteArrayList:用于在遍历操作为主要操作的情况下替代同步的ListConcurrentMap:“若没有则添加”、替换、有条件删除Queue:用来临时保存一组待处理的元素,Queue上的操作不会阻塞,如果队列为空,那么获取元素的操作将返回空值。虽然可以用List来模拟Que原创 2016-08-11 13:52:30 · 2920 阅读 · 1 评论 -
JVM学习之jstat使用方法
原文地址:https://blog.csdn.net/xiongyouqiang/article/details/79727810Jstat是JDK自带的一个轻量级工具,主要用JVM内建的指令对java应用程序的资源和性能进行实时的监控。基本语法 jstat <option> [-t] [-h] <pid> <interval> <count> ...转载 2018-03-30 09:54:08 · 293 阅读 · 0 评论 -
JVM进阶(七)——从GC日志分析堆内存
原文地址:http://blog.csdn.net/sunhuaqiang1/article/details/54646711JVM进阶(七)——从GC日志分析堆内存 在前面的文章中,我们只设置了整个堆的内存大小。但是我们知道,堆又分为了新生代,年老代。他们之间的内存怎么分配呢?新生代又分为Eden和Survivor,他们的比例大小能改变吗?其实这些都是可控的,以前没有讲到是因为转载 2018-02-05 21:57:49 · 294 阅读 · 0 评论 -
JVM进阶(一)——初识JAVA栈
原文地址:http://blog.csdn.net/sunhuaqiang1/article/details/54233648JVM进阶(一)——初识JAVA栈 若想使自己编写的Java程序高效运行,以及进行正确、高效的异常诊断,JVM是不得不谈的一个话题。本”JVM进阶“专栏大部分内容均来源于经典书籍《深入理解Java虚拟机》。 下面言归正传,本文重点从虚转载 2018-01-29 19:43:07 · 286 阅读 · 0 评论 -
Java死磕多线程(volatile)
原文地址:http://blog.csdn.net/Utzw0p0985/article/details/79080954前言当我们再使用多线程的时候经常会碰到一些线程安全的问题,什么是线程安全、什么是线程锁。为什么需要用到线程锁?接下来就分析一下volatile,synchronized,Lock。再这之前我们先要了解Java内存模型并发编程中的三转载 2018-01-17 11:27:35 · 324 阅读 · 0 评论 -
Jvm监控分析总结与分析
原文地址:http://blog.csdn.net/Hedy_csdn/article/details/79003802参考文献:http://www.51testing.com/?uid-188107-action-viewspace-itemid-2264681.分析内存的工具Eclipse Memory Analyzer Tool(俗称MAT),下载地址为:转载 2018-01-16 10:29:52 · 422 阅读 · 0 评论 -
Java线程池执行原理分析
原文地址:http://www.codeceo.com/article/java-thread-pool-implementation.html?ref=myread本文将会围绕线程池的生命周期,分析线程池执行任务的过程。线程池状态首先认识两个贯穿线程池代码的参数:runState:线程池运行状态workerCount:工作线程的数量线程池用一个32位的转载 2016-11-14 19:38:50 · 1167 阅读 · 0 评论 -
JVM中GC机制、收集器和调优
原文地址:http://blog.csdn.net/vernonzheng/article/details/8460128一、回顾JVM内存分配需要了解更多内存模式与内存分配的,请看 深入JVM系列(一)之内存模型与内存分配1.1、内存分配:1、对象优先在EDEN分配2、大对象直接进入老年代 3、长期存活的对象将进入老年代 4转载 2016-10-05 13:10:25 · 1137 阅读 · 0 评论 -
JVM高级特性整理
原文地址:http://blog.csdn.net/shiyuezhong/article/details/507771341.1991年开始启动,java的前身oak,james gosling博士;1995年改名java;1996年jdk1.0发布;2002年jdk1.4发布,走向成熟;2004年jdk1.5发布,加入自动装箱、泛型、动态注解、枚举、可变长参数、foreach等,还有con转载 2016-10-18 17:09:54 · 1179 阅读 · 0 评论 -
Java的ReadWriteLock实现机制解析(一)
原文地址:http://developer.51cto.com/art/201103/249288.htm如果接触过多线程编程或者大规模并发应用的开发的人都应该知道Readers-writer lock的设计模式,从英文字面上看就是对于资源允许多个Reader(复数)并发读,单个Writer写的锁机制,而Reader和Writer互斥。现在的JDK里有一个ReadWriteLo转载 2016-10-16 10:16:17 · 2222 阅读 · 0 评论 -
Java的ReadWriteLock实现机制解析(二)
原文地址:http://developer.51cto.com/art/201103/249288_1.htm1.3 EDU.oswego.cs.dl.util.concurrent.ReentrantWriterPreferenceReadWriteLock上一篇说到了WriterPreferenceReadWriteLock,这一篇说一下ReentrantWriterPre转载 2016-10-16 10:38:11 · 698 阅读 · 0 评论 -
Java并发编程中Executor框架
在Java类库中,任务执行的主要抽象不是Thread,而是Executor。Executor源代码如下:public interface Executor { void execute(Runnable command);}它提供了一种标准的方法将任务的提交过程与执行过程解耦开来,并用Runnable来表示任务。Executor的实现还提供了对生命周期的支持以及统计信息收集、应原创 2016-08-11 15:59:38 · 2435 阅读 · 0 评论 -
Java关闭线程的安全方法
原文地址:http://www.cnblogs.com/simbachen/p/4009562.htmlJava之前有一个api方法可以直接关闭线程,stop(),由于这个方法是强制性地关闭线程,有的时候会发生错误,之后就取消了,现在可用的方法主要有两种:1、 在线程中加入一个成员变量,当一个flag使用。在线程run()方法中轮流去检查这个变量,变量变化时就退出这个线程。代码示转载 2016-10-01 15:41:41 · 612 阅读 · 1 评论 -
Java与线程
并发不一定要依赖多线程(如PHP中很常见的多进程并发)。线程的实现 各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度(线程是CPU调度的基本单位)。 每个已经执行start()且还未结束的java.lang.Thread类的实例就代表了一个线程。Thread的所有关键方法都是声明为Native的。在Java API中,一个Native方法往往意味着这个方法没有使原创 2016-09-18 11:29:47 · 1882 阅读 · 2 评论 -
Java多线程中join方法的理解
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。t.join(); //使调用线程 t 在此之前执行完毕。t.join(1000); //等待 t 线程,等待时间是1000毫秒 先上一段JDK中代码:Java代码转载 2016-09-02 14:57:28 · 336 阅读 · 0 评论 -
Linux使用jstat命令查看jvm的GC情况
原文地址:http://blog.csdn.net/zlzlei/article/details/46471627命令格式jstat命令命令格式:jstat [Options] vmid [interval] [count]参数说明:Options,选项,我们一般使用 -gcutil 查看gc情况vmid,VM的进程号,即当前运行的java进程号interv转载 2016-09-23 15:41:17 · 609 阅读 · 0 评论 -
JVM垃圾收集算法
1.标记-清除算法(Mark-Sweep) 算法分为:“标记”和“清除”两个阶段。 主要不足: 1)效率问题:标记和清除两个过程的效率都不高 2)空间问题:标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。2.复制算法(Copying) 它将可用内存按原创 2016-08-23 09:42:29 · 376 阅读 · 0 评论 -
Java内存模型
概述 衡量一个服务性能的高低好坏,每秒事务处理数(Transactions Per Second,TPS) 是最重要的指标之一,它代表着一秒内服务器平均能响应的请求总数,而TPS值与程序的并发能力又有非常密切的关系。 Java内存模型(Java Memory Model,JMM)用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。J原创 2016-09-02 09:08:52 · 2691 阅读 · 1 评论 -
Java锁优化
锁优化技术:适应性自旋(Adaptive Spinning)、锁消除(Lock Elimination)、锁粗化(Lock Coarsening)、轻量级锁(Lightweight Locking)和偏向锁(Biased Locking)等。这些技术都是为了在线程之间更高效地共享数据,以解决竞争问题,从而提高程序的执行效率。1.自旋锁和自适应自旋如果物理机器有一个以上的处理器,能让两个原创 2016-08-14 09:04:29 · 2256 阅读 · 0 评论 -
实战:OutOfMemoryError和StackOverflowError异常
Java堆溢出 Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常。 -Xms:堆的最小值 -Xmx:堆的最大值 -XX:+HeapDumpOnOutOfMemoryError:可以让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照以便事原创 2016-08-25 11:15:43 · 3993 阅读 · 0 评论 -
JVM运行时数据区域
Java虚拟机运行时数据区:程序计数器(Program Counter Register) 它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 由于Java虚拟机的多线程是通过线程轮流切换并分配处原创 2016-08-25 10:02:27 · 372 阅读 · 0 评论 -
Tomcat正统的类加载器架构
一个功能健全的Web服务器,要解决如下几个问题: 1)部署在同一个服务器上的两个Web应用程序所使用的Java类库可以实现相互隔离。 2)部署在同一个服务器上的两个Web应用程序所使用的Java类库可以相互共享。 3)服务器需要尽可能地保证自身的安全不受部署的Web应用程序影响。 4)支持JSP应用的Web服务器,大多数都需要支持HotSwap功能。“主流”的Web服务器都原创 2016-08-25 09:08:01 · 876 阅读 · 0 评论 -
JVM垃圾收集器参数总结
垃圾收集相关的常用参数参数描述UseSerialGC 虚拟机运行在Client模式下的默认值,打开此开关后,使用Serial+Serial Old的收集器组合进行内存回收UseParNewGC打开此开关后,使用ParNew+Serial Old的收集器组合进行内存回收UseConcMarkSweepGC打开此开关后,使用Par原创 2016-08-24 20:13:35 · 1287 阅读 · 0 评论 -
HotSpot的算法实现
1.枚举根节点 从可达性分析中从GC Roots节点找引用链这个操作为例,可作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如帧栈中的本地变量表)中,现在很多应用仅仅方法区就有数百兆,如果要逐个检查这里面的引用,那么必然会消耗很多时间。 另外,可达性分析对执行时间的敏感还体现在GC停顿上,因为这项分析工作必须在一个能确保一致性的快照中进行--这里“一原创 2016-08-23 13:48:07 · 435 阅读 · 0 评论 -
JVM对象已死吗
1.引用计数器(Reference Counting) 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,当引用失效时,计数器值就减1,任何时刻计数器为0的对象就是不可能再被使用的。 使用引用计数器算法进行内存管理的应用: 1)微软的COM(Component Object Model)技术 2)使用ActionScript3的FlashPlayer原创 2016-08-23 10:11:00 · 654 阅读 · 0 评论