- 博客(16)
- 收藏
- 关注
原创 多线程和并发的区别
并发与多线程之间的关系就是目的与手段之间的关系。 并发(Concurrent)的反面是串行,串行好比多个车辆行驶在一股车道上,它们只能“鱼贯而行”。而并发好比多个车辆行驶在多股车道上,它们可以“并驾齐驱”。并发的极致就是并行(Parallel)。多线程就是将原本可能是串行的计算“改为”并发(并行)的一种手段、途径或者模型。 因此,有时我们也称多线程编程为并发编程。当然,目的与手...
2018-03-25 22:16:54 5171
原创 内存分配和回收策略
Java技术体系中所提倡的自动内存管理最终可以归结为两个问题:给对象分配内存和回收分配给对象的内存。对象的内存分配,大方向就是在堆上的分配(但也可能经过JIT编译后被拆散为标量类型并间接的栈上分配),对象主要分配在新生代上的Eden区,如果启动了本地分配缓冲,将按照线程优先在TLAB上分配。少数情况下也可能会直接分配在老年代中,细节取决于当前使用哪一种垃圾收集器组合和虚拟机中与内存相关的参...
2018-03-25 19:25:15 246
原创 垃圾收集器
如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。这里讨论的收集器基于JDK1.7Update14之后的HotSpot虚拟机,这个虚拟机包含的所有收集器如图所示: 如果收集器直接存在连线就说明可以搭配使用,重点分析CMS和G1这两款相对复杂的收集器。一、垃圾收集器类型(一)Serial收集器 Serial收集器是最基本、发展历史最悠久的收集器,它是一个单线...
2018-03-25 18:07:59 217
原创 垃圾收集算法
一、标记-清除算法 该算法分为标记和清除两个阶段:首先标记出所有需要回收的对象,然后在标记完成后统一回收所有被标记的对象。该算法有两个不足之处:一个是效率问题,标记和清除两个过程的效率不高,另一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时候,无法找到足够的连续内存而不得不提现触发一次垃圾收集动作。二、复制算法 为了解...
2018-03-25 17:47:31 173
原创 如何判别对象已死?
GC的历史比Java还有久远,我们在思考GC时候需要思考三个问题:哪些内存需要回收?什么时候回收?如何回收? 在Java中程序计数器、虚拟机栈、本地方法栈这三个区域随线程而生,随线程而灭:栈中的栈帧随着方法的调用和退出而有条不紊的进行着入栈和出栈的过程。每个栈帧分配多少内存在类结构确定下来时就已知的,方法结束或者线程结束内存自然跟着回收了。 而Java堆和方法区不一样,一个接口...
2018-03-25 17:44:08 740
原创 简单工厂模式
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。一、实现(一)抽象产品/** * 抽象人类,四个属性 * @author EX-SONGTIANXI001 ...
2018-03-20 11:19:01 215
原创 类图中常见的关系
类图(Class diagram)是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图中常见的关系有:1.关联关系(Association)2.继承(Inheritance)3.实现关系(Realization/Implementation)4.依赖关系(Dependency)5.聚合关系(Aggregation)6.复合关系(Composition)...
2018-03-20 10:26:26 1172
原创 JVM内存运行时区域中的OutOfMemoryError
在Java虚拟机规范中,除了程序计数器外,虚拟机内存的其他几个运行时数据区域都有可能发生OutOfMemoryError异常的可能。一、Java堆溢出 Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么对象数量到达最大的容量限制后就会产生内存溢出异常。public class HeapOMM { s...
2018-03-19 23:17:15 409
原创 Java中New一个对象是个怎么样的过程?
在语言层面创建对象(例如克隆、反序列化)通常仅仅是一个new关键字而已,而在虚拟机中,对象(普通Java对象,不包括数组和Class对象等)的创建时一个怎么样的过程?一、对象的创建 当虚拟机遇到一条new指令时候,首先去检查这个指令的参数是否能在常量池中能否定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。 ...
2018-03-19 23:09:50 23591 2
原创 JVM内存模型
对于Java程序员来说,在虚拟自动内存管理机制下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出问题,会有虚拟机自动管理内存。不过,也正因为这样将内存的控制权利交给了Java虚拟机,所以一旦出现内存泄漏和内存溢出方面的问题,如果不了解虚拟机是如何管理内存的,那么排查问题将会成为一项异常艰难的工作。一、运行时数据区域(一)程序计数器(Progra...
2018-03-18 20:06:04 294
原创 JVM知识概要
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Jav...
2018-03-13 17:05:26 271
原创 TCP协议的3次握手与4次挥手
一、定义 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内, 另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上...
2018-03-12 13:54:14 381
原创 排序算法2:插入排序
一、定义 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2),是稳定的排序方法。二、思路1.从第一个元素开始,该元素可以认为已经被排序。2.取出下一个元素,在已经排序的元素序列中从后向前扫描。3. 如果该元素(已排序)大于新元素,将该元素移到下一位置。4.重复步骤3,直到找到已排序的元素小于或...
2018-03-10 11:27:48 247
原创 排序算法1:冒泡排序
一、定义 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。二、思路 1.比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置。 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这步做完后,最后的元素会是最大的数。 3.针对所有的元素重复以上的步骤...
2018-03-10 10:54:24 340
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人