坦GA
积沙成塔
展开
-
Java并发编程--线程封闭(Ad-hoc、栈、ThreadLocal)
线程封闭(Thread Confinement):仅在单线程内访问数据,不需要同步。常见应用是:JDBC(Java Database Connectivity)的Connection对象。1.Ad-hoc线程封闭 指维护线程封闭性的职责完全由程序实现来承担。Ad-hoc线程封闭是非常脆弱的,因为没有任何一种语言特性,例如可见性修饰符或局部变量,能将对象封闭到目标线程上。 当决定使用原创 2016-08-21 10:51:38 · 4771 阅读 · 0 评论 -
JVM关闭
正常关闭: 1.当最后一个“正常(非守护)”线程结束时 2.当调用System.exit时 3.通过其它特定于平台的方法关闭(例如发送了SIGINT信号或键入Ctrl+C) 强行关闭: 1.调用Runtime.halt 2.在操作系统中“杀死”JVM进程(例如发送SIGKILL)1.关闭钩子(Shutdown Hook) 关闭钩子指通过Runtime.add原创 2016-08-21 15:34:11 · 2364 阅读 · 0 评论 -
JVM垃圾收集算法
1.标记-清除算法(Mark-Sweep) 算法分为:“标记”和“清除”两个阶段。 主要不足: 1)效率问题:标记和清除两个过程的效率都不高 2)空间问题:标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。2.复制算法(Copying) 它将可用内存按原创 2016-08-23 09:42:29 · 368 阅读 · 0 评论 -
JVM垃圾收集器--概述
垃圾收集(Garbage Collection,GC),人们就在思考GC需要完成的3件事情: 1)哪些内存需要回收? 2)什么时候回收? 3)如何回收? 为什么我们要去了解GC和内存分配呢?答案很简单:当需要排查各种内存溢出、内存泄露时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。 Java内存运行时区域的各原创 2016-08-23 10:09:52 · 400 阅读 · 0 评论 -
JVM对象已死吗
1.引用计数器(Reference Counting) 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,当引用失效时,计数器值就减1,任何时刻计数器为0的对象就是不可能再被使用的。 使用引用计数器算法进行内存管理的应用: 1)微软的COM(Component Object Model)技术 2)使用ActionScript3的FlashPlayer原创 2016-08-23 10:11:00 · 651 阅读 · 0 评论 -
HotSpot的算法实现
1.枚举根节点 从可达性分析中从GC Roots节点找引用链这个操作为例,可作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如帧栈中的本地变量表)中,现在很多应用仅仅方法区就有数百兆,如果要逐个检查这里面的引用,那么必然会消耗很多时间。 另外,可达性分析对执行时间的敏感还体现在GC停顿上,因为这项分析工作必须在一个能确保一致性的快照中进行--这里“一原创 2016-08-23 13:48:07 · 431 阅读 · 0 评论 -
JVM垃圾收集器
这里讨论的收集器基于JDK1.7 Update 14之后的HotSpot虚拟机(在这个版本正式提供了商用的G1收集器,之前G1仍处于试验状态),这个虚拟机包含的所有收集器如下:HotSpot虚拟机的垃圾收集器 上图中:如果两个收集器之间存在连线,就说明它们可以搭配使用。1.Serial收集器 这个收集器是一个单线程的收集器,但它的“单线程”的意义并不仅仅说明它只原创 2016-08-24 09:05:28 · 393 阅读 · 0 评论 -
JVM垃圾收集器--G1收集器
G1(Garbage-First)是一款面向服务端应用的垃圾收集器。 与其它GC收集器相比,G1具备如下特点: 1)并行与并发:G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短Stop-The-World停顿时间,部分其它收集器原本需要停顿Java线程执行的GC动作,G1收集器仍然可以通过并发的方式让Java程序继续执行。 2)分代收集:原创 2016-08-24 19:05:38 · 952 阅读 · 0 评论 -
JVM垃圾收集器参数总结
垃圾收集相关的常用参数参数描述UseSerialGC 虚拟机运行在Client模式下的默认值,打开此开关后,使用Serial+Serial Old的收集器组合进行内存回收UseParNewGC打开此开关后,使用ParNew+Serial Old的收集器组合进行内存回收UseConcMarkSweepGC打开此开关后,使用Par原创 2016-08-24 20:13:35 · 1282 阅读 · 0 评论 -
Tomcat正统的类加载器架构
一个功能健全的Web服务器,要解决如下几个问题: 1)部署在同一个服务器上的两个Web应用程序所使用的Java类库可以实现相互隔离。 2)部署在同一个服务器上的两个Web应用程序所使用的Java类库可以相互共享。 3)服务器需要尽可能地保证自身的安全不受部署的Web应用程序影响。 4)支持JSP应用的Web服务器,大多数都需要支持HotSwap功能。“主流”的Web服务器都原创 2016-08-25 09:08:01 · 872 阅读 · 0 评论 -
JVM运行时数据区域
Java虚拟机运行时数据区:程序计数器(Program Counter Register) 它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 由于Java虚拟机的多线程是通过线程轮流切换并分配处原创 2016-08-25 10:02:27 · 368 阅读 · 0 评论 -
实战:OutOfMemoryError和StackOverflowError异常
Java堆溢出 Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常。 -Xms:堆的最小值 -Xmx:堆的最大值 -XX:+HeapDumpOnOutOfMemoryError:可以让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照以便事原创 2016-08-25 11:15:43 · 3987 阅读 · 0 评论 -
Javac编译器详解
前端编译器:把*.java文件转变成*.class文件 后端运行期编译器(JIT编译器,Just In Time Compiler):把字节码转成机器码 静态提前编译器(AOT编译器,Ahead Of Time Compiler):把*.java编译成本地机器码 前端编译器:Sun的Javac、Eclipse JDT中的增量式编辑器(ECJ) JIT编译器:HotS原创 2016-08-31 13:38:27 · 6925 阅读 · 1 评论 -
Java类加载器
虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放在Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。 类加载器应用在:类层次划分、OSGi、热部署、代码加密等领域。 类与类加载器 对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一原创 2016-09-01 16:18:15 · 484 阅读 · 0 评论 -
Java内存模型
概述 衡量一个服务性能的高低好坏,每秒事务处理数(Transactions Per Second,TPS) 是最重要的指标之一,它代表着一秒内服务器平均能响应的请求总数,而TPS值与程序的并发能力又有非常密切的关系。 Java内存模型(Java Memory Model,JMM)用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。J原创 2016-09-02 09:08:52 · 2684 阅读 · 1 评论