
JVM
hebeind100
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
一文读懂什么是Java中的自动拆装箱
基本数据类型基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型。它们是我们编程中使用最频繁的类型。Java是一种强类型语言,第一次申明变量必须说明数据类型,第一次变量赋值称为变量的初始化。 Java基本类型共有八种,基本类型可以分为三类:字符类型char布尔类型boolean整数类型byte、short、int、long浮点数类型float、...原创 2018-09-05 09:35:54 · 176 阅读 · 0 评论 -
JVM 内存结构
JVM 内存结构 前面介绍了内存的不同形态:物理内存和虚拟内存。介绍了内存的使用形式:内核空间和用户空间。接着又介绍了Java 有哪些组件需要使用内存。下面着重介绍在JVM 中是如何使用内存的。 JVM 是按照运行时数据的存储结构来划分内存结构的,JVM 在运行Java 程序时,将它们划分成几种不同格式的数据,分别存储在不同的区域,这些数据统一称为运行时数据(Ru...原创 2014-10-25 15:22:44 · 121 阅读 · 0 评论 -
在Java 中哪些组件需要使用内存
Java 启动后也作为一个进程运行在操作系统中,那么这个进程有哪些部分需要分配内存空间呢? Java 堆Java 堆是用于存储Java 对象的内存区域,堆的大小在JVM 启动时就一次向操作系统申请完成,通过 -Xmx 和 -Xms 两个选项来控制大小,Xmx 表示堆的最大大小,Xms 表示初始大小。一旦分配完成,堆的大小就将固定,不能在内存不够时再向操作系统重新申请,...原创 2014-10-25 15:13:09 · 178 阅读 · 0 评论 -
内核空间与用户空间
内核空间与用户空间 一个计算机通常有一定大小的内存空间,如使用的计算机是4GB 的地址空间,但是程序并不能完全使用这些地址空间,因为这些地址空间被划分为内核空间和用户空间。程序只能使用用户空间的内存,这里所说的使用是指程序能够申请的内存空间,并不是程序真正访问的地址空间。 内核空间主要是指操作系统运行时所使用的用于程序调度、虚拟内存的使用或者连接硬件资源等的程序...原创 2014-10-25 15:10:00 · 265 阅读 · 0 评论 -
物理内存与虚拟内存
物理内存与虚拟内存 所谓物理内存就是我们通常所说的RAM(随机存储器)。在计算机中,还有一个存储单元叫寄存器,它用于存储计算单元执行指令(如浮点、整数等运算时)的中间结果。寄存器的大小决定了一次计算可使用的最大数值。 连接处理器和RAM 或者处理器和寄存器的是地址总线,这个地址总线的宽度影响了物理地址的索引范围,因为总线的宽度决定了处理器一次可以从寄存器或者内存中获...原创 2014-10-25 15:08:14 · 218 阅读 · 0 评论 -
Java 8的元空间(metaspace)
很多开发者都在其系统中见过“java.lang.OutOfMemoryError: PermGen space”这一问题。这往往是由类加载器相关的内存泄漏以及新类加载器的创建导致的,通常出现于代码热部署时。相对于正式产品,该问题在开发机上出现的频率更高,在产品中最常见的“问题”是默认值太低了。常用的解决方法是将其设置为256MB或更高。 持久代 PermGen space的全称是...原创 2015-09-16 14:12:56 · 1177 阅读 · 0 评论 -
Java8 lambda表达式
lambda表达式。(1)以下是维基百科上对于"Lambda expression"的解释: afunction (or a subroutine) defined, and possibly called, without being bound toan identifier。 简单点说就是:一个不用被绑定到一个标识符上,并且可能被调用的函数。这个解释还不够通俗,lamb...原创 2015-09-15 11:48:54 · 1249 阅读 · 0 评论 -
Java 8的全新特性
通过简单明了的代码示例,你将会学习到如何使用默认接口方法,Lambda表达式,方法引用和重复注解。看完这篇教程后,你还将对最新推出的API有一定的了解,例如:流控制,函数式接口,map扩展和新的时间日期API等等。目 录 [ - ]允许在接口中有默认方法实现Lambda表达式函数式接口方法和构造函数引用Lambda的范围...原创 2015-09-14 17:19:35 · 127 阅读 · 0 评论 -
你应该更新的Java知识之Observer
作为一个Java程序员,不熟悉设计模式简直不好意思和人打招呼,而Observer模式可以说是位列最常用的设计模式之列,虽然有时候在具体代码里,它不一定叫这个名字,比如改头换面叫个Listener,但模式就是这个模式。 手工实现一个Observer也不是多复杂的一件事,只是因为这个设计模式实在太常用了,Java就把它放到了JDK里面:Observable和Observer,从JDK 1.0...原创 2016-07-30 21:12:36 · 131 阅读 · 0 评论 -
JAVA Observer
Java 提供了 Observer 模式的默认实现,下面我们就看一下 Java 对 观察者模式的支持。Java 对 观察者模式的支持 主要体现在 Observable 类和 Observer 接口。 (1) Observable 类代表 被观察者 (java.util.Observable) 主要方法有: void setChanged(): 设置...原创 2016-07-30 21:11:59 · 132 阅读 · 0 评论 -
Java之CountDownLatch使用
CountDownLatch1、类介绍一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。 一个线程...原创 2016-07-24 18:01:25 · 103 阅读 · 0 评论 -
JVM 内存分配策略
JVM 内存分配策略 在分析JVM 内存分配策略之前先介绍一下通常情况下操作系统都是采用哪些策略来分配内存的。 通常的内存分配策略 在操作系统中将内存分配策略分为三种,分别是:◎ 静态内存分配;◎ 栈内存分配;◎ 堆内存分配。 静态内存分配是指在程序编译时就能确定每个数据在运行时的存储空间需求,因此在编译时就可以给它们分配固定的内存空间。这种...原创 2014-10-25 15:27:54 · 193 阅读 · 0 评论 -
JVM 内存回收策略
JVM 内存回收策略 就Java语言本身来说,通常显式的内存申请有两种:一种是静态内存分配,另一种是动态内存分配。 静态内存分配和回收在 Java 中静态内存分配是指在Java 被编译时就已经能够确定需要的内存空间,当程序被加载时系统把内存一次性分配给它。这些内存不会在程序执行时发生变化,直到程序执行结束时内存才被回收。在Java 的类和方法中的局部变量包括原生数...原创 2014-10-26 19:39:25 · 234 阅读 · 0 评论 -
volatile关键字(复习)
在Java相关的岗位面试中,很多面试官都喜欢考察面试者对Java并发的了解程度,而以volatile关键字作为一个小的切入点,往往可以一问到底,把Java内存模型(JMM),Java并发编程的一些特性都牵扯出来,深入地话还可以考察JVM底层实现以及操作系统的相关知识。 下面我们以一次假想的面试过程,来深入了解下volitile关键字吧!面试官: Java并发这块了解的怎么样?说说你对vola...原创 2018-01-15 14:39:47 · 303 阅读 · 0 评论 -
Java信号量—Semaphore
Semaphore用来控制同时访问某一资源的操作数量,或控制同时执行某个指定操作的数量。主要通过控制一组虚拟的“许可”,当需要执行操作时首先申请获取许可,如果还有剩余的许可 并且获取成功,就执行操作;如果剩余许可为0,就阻塞当前线程;操作执行完成后释放许可,排队的阻塞线程可以被唤醒重新获取许可继续执行。这里提到排队,其实就是利用AQS的队列进行排队。 咋一看跟CountDownLatch...原创 2018-01-04 14:44:03 · 192 阅读 · 0 评论 -
Java同步器AbstractQueuedSynchronizer--AQS
Java同步器AbstractQueuedSynchronizer简称AQS(文中全称和简写混用),在java.util.concurrent包中很多依赖状态的API都是基于AQS实现的,比如常用的:ReentrantLock、Semaphore、CountDownLatch、ThreadPoolExecutor等等。 可以说AQS是java并发包实现的基石,深入理解AQS可以帮助...原创 2018-01-04 14:42:42 · 344 阅读 · 1 评论 -
Java闭锁—CountDownLatch
CountDownLatch,它可以阻塞一个或多个线程,以等待另一组事件的发生后,继续执行被阻塞的一个或多个线程。CountDownLatch的两个核心方法:调用await方法阻塞一个或多个线程;调用countDown方法,执行一组事件,每调用一次对“资源”数减1,当剩余“资源”数为0时,被阻塞的一个或多个线程同时被唤醒。这其实就是AQS的共享方式实现,在分析CountDownLatch实现原理...原创 2018-01-04 14:34:29 · 159 阅读 · 0 评论 -
java中的Iterator和Iterable 区别
Iterator是迭代器类(其实在javaAPI中其也是一个接口),而Iterable是接口。 好多类都实现了Iterable接口,这样对象就可以调用iterator()方法(返回一个Iterator对象)。 一般都是结合着用,比如 HashMap类就实现了Iterable接口,而要访问或打印出Map中所有内容时,就可以这样: HashMap hashMap; Iterator iter = h...原创 2017-12-04 15:27:48 · 131 阅读 · 0 评论 -
深入了解 Java 之虚拟机内存
在讨论JVM内存区域分析之前,先来看一下Java程序具体执行的过程:Java 程序的执行过程:Java 源代码文件(.Java文件)-> Java Compiler(Java编译器)->Java 字节码文件(.class文件)->类加载器(Class Loader)->Runtime Data Area(运行时数据)-> Execution Engine(执...原创 2017-10-18 11:09:57 · 116 阅读 · 0 评论 -
Java9新功能之HTTP2和REPL
对Java 9的炒作将不再局限于模块化(modularity),Java 9正在搜罗大量额外的功能模块,这些功能模块正作为Java增强提案(JEP)提交,并在OpenJDK (Java SE的参考实现项目)中实现。在这篇文章中,我们将重点关注一些或将在Java 9整个生命周期中,对开发者的工作生活影响最大的JEP,包括新的HTTP/2支持和JShell REPL(读取-求值-打印-循环),后...原创 2016-04-13 09:32:25 · 125 阅读 · 0 评论 -
Java线程池使用说明
一简介线程的使用在Java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的。在jdk1.5之后这一情况有了很大的改观。Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用。为我们在开发中处理线程的问题提供了非常大的帮助。二:线程池线程池的作用:线程池作用就是限制系统中执行线程的数...原创 2017-06-22 19:01:56 · 249 阅读 · 0 评论 -
Java7/Java8中HashMap解析
HashMap内部存储过程:HashMap类实现了Map<K,V>接口,主要方法包括: V put(K key,V value)V get(Object key)V remove(Object key)Boolean containsKey(Object key) HashMap用一个内部类来添加数据:Entry<K,V>是一个k...原创 2017-06-22 15:48:30 · 149 阅读 · 0 评论 -
Java位操作全面总结
在计算机中所有数据都是以二进制的形式储存的。位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快。在实际编程中,如果能巧妙运用位操作,完全可以达到四两拨千斤的效果,正因为位操作的这些优点,所以位操作在各大IT公司的笔试面试中一直是个热点问题。位操作基础基本的位操作符有与、或、异或、取反、左移、右移这6种,它们的运算规则如下所示:注意以下几点:在这6种操...原创 2016-04-07 12:29:58 · 137 阅读 · 0 评论 -
Comparison method violates its general contract
采用Collections.sort 或Google Sort来对文件进行排序,出现Comparison method violates its general contract 异常,找了好久,才发现是实现接口Comparator 的类有问题,在compare中没有处理好两个比较的对象相等的情况public int compare(T lhs, T rhs);即 l...原创 2016-07-19 19:35:08 · 174 阅读 · 0 评论 -
Java多线程-新特征-信号量Semaphore
简介信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。概念Semaphore分为单值和多值两种,前者只能被一个线程获得,后者可以被若干个线程获得。以一个停车场运作为例。为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下...原创 2016-07-09 14:22:10 · 104 阅读 · 0 评论 -
Collections中sort()方法源代码的简单分析
Collections的sort方法代码:[java] view plain copy print?public static <T> void sort(List<T> list, Comparator<? super T> c) { Object[] a = list.toArray(); ...原创 2016-07-05 19:54:44 · 128 阅读 · 0 评论 -
LinkedList实现原理
一、源码解析 1、 LinkedList类定义。 public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable ...原创 2016-05-02 21:08:30 · 219 阅读 · 0 评论 -
Java集合---ArrayList的实现原理
一、 ArrayList概述: ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。 ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发...原创 2016-05-01 21:15:41 · 124 阅读 · 0 评论 -
PriorityQueue实现原理
PriorityQueue是个基于优先级堆的极大优先级队列。此队列按照在构造时所指定的顺序对元素排序,既可以根据元素的自然顺序来指定排序(参阅 Comparable),也可以根据 Comparator 来指定,这取决于使用哪种构造方法。优先级队列不允许 null 元素。依靠自然排序的优先级队列还不允许插入不可比较的对象(这样做可能导致 ClassCastException)。此队列的头是按指定排序...原创 2016-05-01 21:14:22 · 238 阅读 · 0 评论 -
Java并发包中的同步队列SynchronousQueue实现原理
介绍Java 6的并发编程包中的SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除操作take,反过来也一样。不像ArrayBlockingQueue或LinkedListBlockingQueue,SynchronousQueue内部并没有数据缓存空间,你不能调用peek()方法来看队列中是否有数据元素,因...原创 2016-05-01 21:13:41 · 195 阅读 · 0 评论 -
CopyOnWrite实现原理
Java中提供了两个CopyOnWrite容器,分别是CopyOnWriteArrayList和CopyOnWriteArraySet。如果想要高效的使用这两个容器,我觉的首先要弄懂CopyOnWrite的原理。那么下面就先来谈谈什么是CopyOnWrite吧。什么是CopyOnWriteCopyOnWrite即写时复制,该机制在于控制对数据的操作,什么时候需要对数据的操作进行控制呢,...原创 2016-05-01 21:11:58 · 774 阅读 · 0 评论 -
java字符串分解 StringTokenizer用法(比split()方法效率高)
ava中substring方法可以分解字符串,返回的是原字符串的一个子字符串。如果要讲一个字符串分解为一个一个的单词或者标记,StringTokenizer可以帮你。int countTokens():返回nextToken方法被调用的次数。boolean hasMoreTokens():返回是否还有分隔符。boolean hasMoreElements():返回是否还有分隔符。String...原创 2016-04-16 15:07:12 · 340 阅读 · 0 评论 -
运行Java jar文件 报java.lang.OutOfMemoryError: Java heap space错误的解决方法
在Eclipse中运行Java Project一切正常,但是生成该project的jar后,运行jar文件报内存不足的错误(java.lang.OutOfMemoryError: Java heap sapce) 分析原因:JVM在启动时会自动设置Heap Size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。我们可以...原创 2015-05-04 11:25:37 · 1931 阅读 · 0 评论 -
Java并发编程学习笔记(4)
第三部分:活跃度、性能和测试10 避免活跃度危险如果所有线程以通用的固定秩序获得锁,程序就不会出现顺序锁死锁问题了。当调用的方法不需要持有锁时,这被称为是“开放调用”。依赖于开放调用的类会具有更好的行为,并且比那些需要获得锁才能调用的方法相比,更容易与其他类合作。 在程序中尽量使用开放调用,依赖于开放调用的程序,相比于那些在持有锁时还调用外部方法的程序,更容易执行死锁自由度的...原创 2015-01-24 19:32:59 · 153 阅读 · 0 评论 -
Java并发编程学习笔记(3)
8应用线程池有些类型的任务需要明确指定一个执行策略,如依赖性任务、采用线程限制的任务,对响应时间敏感的任务、使用ThreadLocal的任务。(只有当线程本地thread_local()值的生命周期被限制在当前任务种时,在池的某线程中使用ThreadLocal才有意义;在线程池中,不应该使用ThreadLocal传递任务间的数值) 当任务都是同类的、独立时,线程池才有最佳的工作表现。...原创 2015-01-24 19:32:16 · 126 阅读 · 0 评论 -
Java并发编程学习笔记(2)
构建块在实践中,委托是创建线程安全类最有效的策略之一:只需要用已有的线程安全类来观礼所有状态即可。平台类库包含一个并发构建块的丰富集合。比如线程安全容器和多种同步工具(synchronizer:用来调节相互协作的线程间的一些控制流) 同步容器同步容器类包括2部分:一个是Vector+HashTable,一个是它们的同系容器。在JDK1.2时才被加入的同步包装类(Wrapper...原创 2015-01-24 19:31:31 · 163 阅读 · 0 评论 -
HashSet的实现原理
1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。HashSet中不允许有重复元素,这是因为HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是统一的一个private static ...原创 2016-05-02 21:10:24 · 1176 阅读 · 0 评论 -
详解Java中的注解
在Java中,注解(Annotation)引入始于Java5,用来描述Java代码的元信息,通常情况下注解不会直接影响代码的执行,尽管有些注解可以用来做到影响代码执行。注解可以做什么Java中的注解通常扮演以下角色编译器指令构建时指令运行时指令其中Java内置了三种编译器指令,本文后面部分会重点介绍Java注解可以应用在构建时,即当你构建你的项目时。构建过程...原创 2016-05-04 09:38:56 · 145 阅读 · 0 评论 -
AtomicInteger实现机制
问题背景 最近在看LinkedBlockingQueue看到了其中的count使用AtomicInteger修饰,之前也看过AtomicInteger的一些解释,也是似懂非懂的,今天深入的了解了其实现方式,学到了很多东西。基础介绍 要对AtomicInteger有一个深入的认识,就必须要了解一下悲观锁和乐观锁。cpu是时分复用的,也就是把cpu的时间片,分配给不同的线程...原创 2016-07-05 19:50:06 · 152 阅读 · 0 评论 -
java的两种同步方式, Synchronized与ReentrantLock的区别
java在编写多线程程序时,为了保证线程安全,需要对数据同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock。相似点: 这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的同步,也就是说当如果一个线程获得了对象锁,进入了同步块,其他访问该同步块的线程都必须阻塞在同步块外面等待,而进行线程阻塞和唤醒的代价是比较高的(操作系统...原创 2016-07-05 19:44:42 · 321 阅读 · 0 评论