`
文章列表
对于多线程高并发,我们必须要知道这里面涉及的基本概念,就像学武功一样,在学习成套招式的时候,你必须要学会扎稳马步. 我们先介绍多线程高并发中必须知道的几个概念. 1.同步和异步 同步和异步,通常用来形容一次请求调 ...
1.什么是Full GC? 对新生代、老年代、永久代都进行GC,即Full GC。可以通过-XX:ScanengeBeforeFullGC来禁止Full GC时对新生代进行GC。   2.Full GC触发条件 ①System.gc();可以使用-XX:_DisableExplicitGC禁止 ②老年代空间不足(新生代对象转入、创建大对象、大数组)Full GC后仍然不足报OutOfMemoryError: Java heap space。 ③永久代空间满(加载类、反射类、调用方法较多),Full GC后仍然不足报OutOfMemoryError: PermGen space。 ...
说设计模式,如果只是讲理论,估计很多人都会理解不透彻,今天我们结合JDK的源码设计,一块来说下设计模式中的不变模式.   1.什么是不变模式? 在并发程序中,为了保证临界区资源使用时不受其他线程干扰,使用锁控制可能是必 ...
重入锁 为什么叫重入锁?是因为同一个线程可以重复进入自己获取的锁. 1.重入锁的特性 1.1重入锁比synchronized更灵活,它能够显式指定何时加锁,何时解锁.(实例方法lock(),unlock()) 1.2中断响应 使用ReentrantLock的实例方法lockInterruptibly()方法(建议使用可以响应中断的锁),可以在线程要求中断的时候进行响应,避免死锁情况下一直等待.   public class ReentrantLockInterruptDemo implements Runnable { public static ReentrantLock ...
要想了解虚拟机,就需要对虚拟机有整体的认识,下图是纯手工打造.转载请注明出处. 虚拟机主要是由类加载系统,运行时数据区域(虚拟机管理的内存区域),字节码执行引擎,本地方法接口等组成.见图.   我们来逐一介绍虚拟机体系结构中的部分. 1.类加载系统:类加载系统负责将字节码文件加载到虚拟机管理的内存区域(虚拟机不关心字节码文件的来源).这里涉及到类加载机制,请参见类加载机制相关帖. 2.运行时数据区域:此区域是虚拟机进行内存管理和垃圾回收的主要区域.请参见虚拟机运行时数据区域总结及垃圾回收帖. 3.字节码执行引擎:字节码执行引擎是虚拟机最核心的组成部分之一,它会将字节码进行解析并输出 ...
在说到类加载机制之前,要先明白几个基本概念,什么是机器码,什么是字节码。在zzm的虚拟机类加载机制中有一句话是这么说的:“代码编译的结果从本地机器码变为字节码”...这句话是错误的,尽信书不如无书。 1.什么是机器码? 机器码是机器能够通过内置的指令系统识别的指令编码。 2.什么是字节码? 字节码(ByteCode)是一种中间状态的二进制文件(中间码),就是我们常见的*.class文件。 为什么说它是中间码?因为字节码处于源程序(如java语言的.java文件,JRuby的*.rb文件)和机器码之间,是一个中间状态。 3.为什么要用字节码? 平台无关性:我们是否还记得当初学习j ...
1.语法糖 要说语法糖,首先要知道语法糖的含义.我们看百度百科中的定义,语法糖(Syntactic sugar),也译为糖衣语法, 是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法, 这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会. 在JDK1.5之后,增加了很多语法糖,常用的如泛型,变长参数,自动装箱/拆箱,遍历循环(foreach). 今天,我们说一下语法糖之一自动装箱拆箱的梗.   2.语法糖之一--自动装箱/拆箱 在Java语言中 ...
1.3 如何回收 对于如何回收,这里就要说到虚拟机的算法实现了.我们常见的算法有Mark-Sweep,Mark-Compact,Copying,Generational Garbage Collection. 1.3.1 Mark-Sweep,标记-清除算法,按照字面过程,分为标记和清除两个过程. 标记过程就是标记哪些对 ...
1.2 何时回收 前一章节已经明确了,在对象没有被引用的情况下,对象"可能"就要被回收了. 那么,我们怎么知道对象就没有引用了?当然,这里涉及到了算法. 我们介绍两种常用的算法实现:引用计数算法(Reference Counting Algorithm) ...
1.垃圾回收 垃圾回收的历史要比Java语言久远的多,MIT的LISP是第一门真正使用内存动态分配和垃圾收集技术的语言(LISP名称源自列表处理(LISt Processing)的英语缩写,由来自麻省理工学院的人工智能研究先驱约翰·麦卡锡(John McCarthy)在1958年基于λ演算所创造的计算机程序设计语言). 说到垃圾回收(Garbage Collection,简称GC),就要说下垃圾回收是收集什么,何时回收,虚拟机是怎么通过垃圾收集器进行自动垃圾回收的. 1.1 垃圾回收收集什么 按照标准的说法,垃圾回收是一个监控堆内存区域,识别正在使用中或不使用的对象,并对不使用的对象 ...
1.java堆中对象的创建,布局,访问Java对象的内存表示模型是Oop-Klass模型。1.1 对象的创建①虚拟机在碰到一条new指令时,会检查这个指令参数(是一个符号引用,对应一个类)是否能在运行时常量池中定位到一个类,并且检查这个类是否被加载,解析和初始化.②在类加载检查通过后,虚拟机需要为对象分配内存.对象所需内存的大小,在类加载完成后完全确定.这里涉及到对象内存分配的方法:指针碰撞和空闲列表.指针碰撞:如果堆内存空间是绝对规整的,在已分配堆内存和未分配堆内存之间有一个指针作为分界点的指示器.在为新对象分配堆内存时,只需要将指针移动新对象大小的位置即可.空闲列表:如果堆内存时不规整的 ...
本人推荐,如果要看虚拟机的相关内容,并且英语基础不错,可以直接看https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.6.4   1.运行时内存数据区域 根据Java虚拟机规范的规定,Java虚拟机所管理的内存包括以下几个运行时数据 ...
1.JDK每次升级新增的功能大致可以分为4类: ①在编译层面做的改进.如自动装箱拆箱,实际上就是编译器在程序中使用到包装对象的地方自动插入很多Integer.valueOf()之类的代码,泛型的信息在编译阶段就被擦除,相应的地方被编译器自 ...
1.主流的web服务器都实现自己的类加载器,因为一个功能完整的web服务器要解决以下4个问题:①部署在同一个服务器上的web应用使用的java类库可以实现相互隔离.例如,不同的web应用使用了同一个第三方类库的不同版本,不能要求在一个服务器中只能使用一个版本的第三方类库,必须能够实现同一类库不同版本能够在web程序中独立使用.②部署在同一个服务器上的不同web应用直接可以共享某些类库.例如,10个使用spring架构的web应用,我们不能使用10套类库.这不是浪费空间的问题,而是所有类库都需要加载到服务器内存中才能使用,如果不能共享,就容易出现过度膨胀的风险.③服务器需要尽可能保证自身的安全 ...
1.Sun官方定义的java技术体系包括5部分: ①Java程序设计语言 ②各种硬件平台上的Java虚拟机 ③Class文件格式 ④Java API类库 ⑤第三方Java类库 2.JDK:我们把java程序设计语言,java虚拟机,Java API类库统称为JDK(Java Development Kit),JDK是用于支持Java开发环境的最小环境. JRE:我们把Java API类库中Java SE API的子集和java虚拟机两部分称为JRE(Java Runtime Environment).JRE是支持Java程序运行的标准环境.             3.按照技术服务领域划分, ...
Global site tag (gtag.js) - Google Analytics