Fork me on GitHub

随笔分类 -  JVM

摘要:概述 一个对象本身的内在结构需要一种描述方式,这个描述信息是以字节码的方法存储在方法区中的。Class 本身就是一个对象,都以 KB 为单位,如果 new Integer() 为了表示一个数据就占用KB级别的内存就有点不值了,下面讲解 JVM 是如何做的。为了表示对象的属性、方法等信息,不得不需要结 阅读全文
posted @ 2017-03-02 15:44 郑斌blog 阅读(10874) 评论(8) 推荐(5) 编辑
摘要:持续更新系列。 参考自《深入理解Java虚拟机》、《Java性能权威指南》、《分布式Java应用基础与实践》。 Java的内存结构 JVM内存结构——运行时数据区 JVM——代空间的划分 JVM——判断对象的死活 Java内存模型 Java中内存溢出与内存泄露 JVM——深入分析对象的内存布局 垃 阅读全文
posted @ 2017-02-21 20:49 郑斌blog 阅读(2187) 评论(0) 推荐(3) 编辑
摘要:简述 Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。 定义模型的目标 Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储 阅读全文
posted @ 2017-02-17 12:04 郑斌blog 阅读(15956) 评论(2) 推荐(8) 编辑
摘要:内存溢出 内存溢出(out of memory),是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给他存了long才能存下的数,就会发生内存溢出。 内存泄露 内存泄露(memory leak),是指程序在申请内存后,无法释放已申请的内 阅读全文
posted @ 2017-02-17 11:13 郑斌blog 阅读(999) 评论(0) 推荐(1) 编辑
摘要:JVM常用参数 并行收集器相关参数 选择垃圾收集器为并行收集器.此配置仅对年轻代有效.即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集.(此项待验证) CMS相关参数 辅助信息 输出形式: [GC 118250K->113543K(130112K), 0.0094143 secs][Ful 阅读全文
posted @ 2016-09-17 22:56 郑斌blog 阅读(1280) 评论(0) 推荐(0) 编辑
摘要:首先看在JVM的堆中,按代的划分: Young:主要是用来存放新生的对象。 Old:主要存放应用程序中生命周期长的内存对象。 Permanent:是指内存的永久保存区域,主要存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域. 它和存放Instance 阅读全文
posted @ 2016-07-14 12:21 郑斌blog 阅读(803) 评论(0) 推荐(0) 编辑
摘要:概念补充 并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。 并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上。 所有的GC算法都将堆划分成了老年代和新生代。 阅读全文
posted @ 2016-07-13 10:58 郑斌blog 阅读(911) 评论(0) 推荐(1) 编辑
摘要:类加载器双亲委派模型,如下图所示: 双亲委派模型的工作过程 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜 阅读全文
posted @ 2016-07-01 13:06 郑斌blog 阅读(1197) 评论(0) 推荐(0) 编辑
摘要:类装载工作由ClassLoader及其子类负责,ClassLoader是一个重要的Java执行时系统组件,它负责在运行时查找和装入Class字节码文件。JVM在运行时会产生三个ClassLoader:根装载器、ExtClassLoader(扩展类装载器)和AppClassLoader(系统类装载器) 阅读全文
posted @ 2016-07-01 09:45 郑斌blog 阅读(8005) 评论(4) 推荐(5) 编辑
摘要:附一张图方便理解,一个类的执行过程 类的加载过程,简明的来说 类装饰器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件。在Java中,类装载器把一个类装入JVM中,要经过以下步骤: 类装载工作由ClassLoader及其子类负责,ClassLoader是一个重要的Java执行时系统组件,它 阅读全文
posted @ 2016-06-30 21:56 郑斌blog 阅读(3884) 评论(0) 推荐(0) 编辑
摘要:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 在Java语言中,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会为Java应用程序提 阅读全文
posted @ 2016-06-30 21:49 郑斌blog 阅读(687) 评论(0) 推荐(0) 编辑
摘要:一、引用计数法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,当引用失效时,计数器值就减1,任何时刻计数器为0的对象就是不可能再被使用的。 但是它很难解决对象之间相互循环引用的问题。 比如说两个对象互相引用对方,导致它们的引用计数都不为0,于是引用计数算法无法通知GC收集器回收 阅读全文
posted @ 2016-06-25 23:39 郑斌blog 阅读(792) 评论(0) 推荐(0) 编辑
摘要:1.标记-清除算法 最基础的收集算法,如其名,算法为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。 两个不足: 1)效率问题,标记和清除两个过程的效率多不高; 2)空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行 阅读全文
posted @ 2016-06-25 23:36 郑斌blog 阅读(816) 评论(2) 推荐(0) 编辑
摘要:在Java虚拟机规范中将Java运行时数据划分为6种,分别为: PC寄存器(程序计数器) Java栈 堆 方法区 运行时常量池 本地方法栈 一、PC寄存器(程序计数器) PC寄存器(Program Counter Register)严格来说是一个数据结构,它用于保存当前正常执行的程序的内存地址。 线 阅读全文
posted @ 2016-06-25 22:18 郑斌blog 阅读(2033) 评论(0) 推荐(1) 编辑

点击右上角即可分享
微信分享提示