Java学习
文章平均质量分 67
Jerry_Fu24
这个作者很懒,什么都没留下…
展开
-
关于try语句块中含有return的报错的问题
写代码遇到的问题try块有return语句,catch块没有return,函数末尾也没有return:看代码:编译结果:1 错误,提示缺少返回语句 有人可能会说,我在try块中不是有return语句吗?为什么会提示缺少return语句呢?这是因为编译器认为try块中是又可能产生异常操作的,也就是说在return语句之前如果出现异常的话,那么return语句根原创 2016-04-27 09:48:57 · 5172 阅读 · 2 评论 -
深入理解Java虚拟机--运行时栈帧结构
栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构。它是虚拟机运行时数据区的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。 在编译程序代码时,栈帧中需要多大的局部变量表、多深的操作数栈都已经完全确定。并且写入到了方法表的Code属性之中,因此,一个栈需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体的虚拟机实现。原创 2016-07-16 10:22:33 · 2640 阅读 · 0 评论 -
HashMap死循环问题分析
之前参加阿里的性能挑战大赛,需要使用缓存,我就采用了HashMap对数据进行缓存,可运行了一段时间电脑爆卡,我查了一下,可能是死循环问题,就用 jstack dump 了当时的线程快照,发现这次死循环问题的起源是 HashMap 的 get()方法。今天总结一下。 这次事故的原因是因为开发时没有注意到 HashMap 是非线程安全的,而使用 HashMap 的那个地方又是千万数据级原创 2016-07-27 10:57:33 · 8082 阅读 · 4 评论 -
ConcurrentHashMap实现原理--上
JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能。因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低。因此Java5.0开始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入了java.util.concurrent包。与Vector和Hashta原创 2016-07-27 13:54:11 · 316 阅读 · 0 评论 -
ConcurrentHashMap实现原理--中
本篇文章主要讲解关于JVM的内存模型的相关知识,为理解下篇文章ConcurrentHashMap做铺垫! ConcurrentHashMap是Java5中新增加的一个线程安全的Map集合,可以用来替代HashTable。对于 ConcurrentHashMap是如何提高其效率的,可能大多人只是知道它使用了多个锁代替HashTable中的单个锁,也就是锁分离技术。原创 2016-07-27 14:51:29 · 374 阅读 · 0 评论 -
深入理解Java虚拟机--java内存模型与线程
Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。Java内存模型规定了所有的变量都存储在主内存中。每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量值得传递原创 2016-07-16 23:13:56 · 437 阅读 · 0 评论 -
ConcurrentHashMap实现原理总结--下
主要研究ConcurrentHashMap的get、put和remove 这3个操作。对于哈希表,Java中采用链表的方式来解决hash冲突的。 实现了同步的HashTable也是这样的结构,它的同步使用锁来保证的,并且所有同步操作使用的是同一个锁对象。这样若有n个线程同时在get时,这n个线程要串行的等待来获取锁。 ConcurrentHashMap中对这个原创 2016-07-27 16:12:01 · 1757 阅读 · 0 评论 -
ConcurrentHashMap实现原理总结--补充
看完了get操作,再看下put操作,put操作的前面也是确定Segment的过程,这里不再赘述,直接看关键的segment的put方法: 首先对Segment的put操作是加锁完成的,如果Segment中元素的数量超过了阈值(由构造函数中的loadFactor算出)这需要进行对Segment扩容,并且要进行rehash,关于rehash的过程大家可以自己去了解,这里不详细讲原创 2016-07-27 21:00:45 · 2420 阅读 · 0 评论 -
ConcurrentHashMap优化
首先我们这样假设,假设哈希映射的内部数组的大小只有1,所有的元素都将映射该位置(0),从而构成一条较长的链表。由于我们更新、访问都要对这条链表进行线性搜索,这样势必会降低效率。我们假设,如果存在一个非常大数组,每个位置链表处都只有一个元素,在进行访问时计算其 index 值就会获得该对象,这样做虽然会提高我们搜索的效率,但是它浪费了空间。诚然,虽然这两种方式都是极端的,但是它给我们提供了一种优化思原创 2016-07-27 22:45:06 · 1452 阅读 · 0 评论 -
java.io.FileNotFoundException: F:\jstorm (拒绝访问.)
使用JStorm处理数据,将处理结果写入一个文件:报错了,它竟然告诉我这个异常:java.io.FileNotFoundException: F:\jstorm (拒绝访问.) 仔仔细细的检查了一遍,明明存在啊,怎么会报找不到文件这个异常呢???F:\jstorm这是一个文件夹,当你用流来读的时候当然会报找不到文件异常,你应该去读一个文件而不是去读一个文件夹也正因为原创 2016-06-23 21:47:50 · 9597 阅读 · 0 评论 -
HashMap的实现原理总结
转自:http://www.cnblogs.com/xwdreamer/archive/2012/06/03/2532832.html1. HashMap概述: HashMap是基于哈希表的Map接口的非同步实现(Hashtable跟HashMap很像,唯一的区别是Hashtalbe中的方法是线程安全的,也就是同步的)。此实现提供所有可选的映射操作,并允许使用null值和转载 2016-04-27 08:38:17 · 2271 阅读 · 1 评论 -
ArrayList在多线程调用Add()添加元素时的下标越界问题(java.lang.ArrayIndexOutOfBoundsException)
最近在看《实战Java虚拟机》一书,看到有关锁与并发章节时,看到如下一个多线程使用ArrayList的例子: 两个线程t1和t2同时向numberList中添加数据,由于ArrayList是线程不安全的,因此会导致添加的数据有错误,这个我还是能理解的,但是它报的确是如下错误: 我就有点理解不了了,ArrayList不是自动扩容、没有长度限制吗原创 2016-04-27 10:24:56 · 26019 阅读 · 13 评论 -
深入理解Java虚拟机--垃圾回收算法
了解GC和内存分配算法目的:当需要排查各种内存溢出、内存泄漏问题时,当垃圾回收成为系统达到更高并发量的瓶颈时,就需要对此实施必要的监控和调节。 垃圾回收之前最重要的工作——判断对象的死活: 1.引用计数算法:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。主流的java虚拟原创 2016-07-11 09:47:52 · 1498 阅读 · 0 评论 -
深入理解Java虚拟机--内存分配规则
新生代GC(Minor GC):指发生在新生代的垃圾回收动作,因此区域对象大多朝生夕死,所以Minor GC非常频繁,一般回収速度也比较快老年代GC(Major GC/Full GC):指发生在老年代的GC,出现Major GC,经常会伴随至少一次的Minor GC(并非绝对),Major GC一般会比Minor GC慢10倍以上。 1.对象优先分配在Eden,当Eden区没有原创 2016-07-11 15:09:07 · 646 阅读 · 0 评论 -
深入理解Java虚拟机--垃圾回收器
在讨论垃圾回收器的语境中:并行:多条垃圾收集线程并行工作,但此时用户线程仍处于等待状态并发:用户线程与垃圾回收线程同时执行(但不一定是并行,可能会交替执行)1.Serial收集器 最基本、历史最悠久的收集器 单线程收集器,只能使用一个CPU或一条收集线程去完成收集任务,而且期间必须暂停其他所有的工作线程 简单而高效(相比于其他收集器原创 2016-07-11 13:46:26 · 286 阅读 · 0 评论 -
深入理解Java虚拟机--OutOfMemoryError异常
在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(下文称OOM )异常的可能。Java堆溢出 Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常。 下原创 2016-07-08 10:32:59 · 384 阅读 · 0 评论 -
深入理解Java虚拟机--对象访问
对象访问会涉及到Java栈、Java堆、方法区这三个内存区域。 这句代码出现在方法体中,"Object obj” 这部分将会反映到Java栈的本地变量中,作为一个reference类型数据出现。而“new Object()”这部分将会反映到Java堆中,形成一块存储Object类型所有实例数据值的结构化内存,根据具体类型以及虚拟机实现的对象内存布局的不同,这块原创 2016-07-07 22:38:55 · 256 阅读 · 0 评论 -
深入理解Java虚拟机--java内存区域
java运行是数据区一、程序计数器一块较小的内存空间,可看做当前线程所执行的字节码的行号指示器字节码解释器工作依赖计数器控制完成线程私有,生命周期与线程相同唯一在Java虚拟机规范中没有规定任何OutOfMemoryError情况区域二、Java虚拟机栈线程私有,生命周期与线程相同虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都原创 2016-07-07 22:05:53 · 305 阅读 · 0 评论 -
深入理解Java虚拟机--虚拟机性能监控与故障处理工具
jps(JVM Process Status Tool):虚拟机进程状况工具列出正在运行的虚拟机进程显示虚拟机执行主类进程id-l 输出主类的全名 -m输出虚拟机进程启动时传给主类main()函数的参数jstat(JVM Statistics Monitoring Tool):虚拟机统计信息监视工具监视虚拟机运行状态信息,可以查询类装载、垃圾回收、运行期编译状况jsta原创 2016-07-12 10:04:00 · 387 阅读 · 0 评论 -
深入理解Java虚拟机--虚拟机类加载机制
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可被虚拟机直接使用的Java类型,这就是虚拟机加载机制。类加载时机 类从被加载到虚拟机内存中到卸载出内存,整个生命周期:加载、连接、初始化、使用、卸载。其中连接分为验证、准备、解析。解析的顺序不一定,有可能按照上述顺序,也有可能在初始化阶段之后才开始,这是为了支持Java的运行时原创 2016-07-15 16:04:57 · 344 阅读 · 0 评论 -
深入理解Java虚拟机--类加载器
通过一个类的全限定名来获取描述此类的二进制流,执行这个动作的代码模块成为“类加载器”。 两个类只有在同一个类加载器加载的前提下才有意义,否则即使两个类原子相同的Class文件,只要加载它们的加载器不同,那这两个类也是不相等的。这里的相等,包括equals,isAssignableFrom(),isInstance() instanceof等情况。双亲委派模型原创 2016-07-15 23:07:33 · 1072 阅读 · 0 评论 -
Java7并发编程--1、线程管理
1.1 简介 并发和并行从宏观上来讲都是同时处理多路请求的概念。但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。原创 2016-07-23 22:11:15 · 1123 阅读 · 0 评论