随笔分类 -  Java虚拟机

文章基于周志明老师的《深入理解Java虚拟机:JVM高级特性与最佳实践》、陈涛老师的《HotSpot实战》、高翔龙老师的《Java虚拟机精讲》三本书,并在对这些书中的内容进行总结、提炼的基础上加上了自己的理解
摘要:被废弃的持久代 想起之前面试的时候有面试官问起过我一个问题:Java 8为什么要废弃持久代即Metaspace的作用。由于当时使用的Java 7且研究重心不在JVM上,一下没有回答上来,今天突然想起这个问题,就详细总结一下这个问题。 首先我们看一张JVM内存布局的图: 注意到里面有一块METHOD 阅读全文
posted @ 2018-04-01 21:11 五月的仓颉 阅读(10589) 评论(15) 推荐(17) 编辑
摘要:JVM的四种引用状态 在Java虚拟机5:Java垃圾回收(GC)机制详解一文中,有简单提到过JVM的四种引用状态,当时只是简单学习,知道有这么一个概念,对四种引用状态理解不深。这两天重看虚拟机这部分的时候,写了很多例子详细研究了一下JVM的几种引用,对于JVM的引用理解加深了不少,因此总结写一篇文 阅读全文
posted @ 2017-06-27 22:01 五月的仓颉 阅读(5801) 评论(9) 推荐(2) 编辑
摘要:一个对象占多少字节? 关于对象的大小,对于C/C++来说,都是有sizeof函数可以直接获取的,但是Java似乎没有这样的方法。不过还好,在JDK1.5之后引入了Instrumentation类,这个类提供了计算对象内存占用量的方法。至于具体Instrumentation类怎么用就不说了,可以参看这 阅读全文
posted @ 2017-06-14 15:56 五月的仓颉 阅读(5700) 评论(4) 推荐(2) 编辑
摘要:互斥同步 互斥同步(Mutual Exclusion & Synchronization)是常见的一种并发正确性保证手段。同步是指子啊多个线程并发访问共享数据时,保证共享数据在同一时刻只能被一个(或者是一些,使用信号量的时候)线程使用。而互斥是实现同步的一种手段,临界区(Critial Sectio 阅读全文
posted @ 2015-12-02 23:05 五月的仓颉 阅读(4359) 评论(2) 推荐(1) 编辑
摘要:什么是Java内存模型 Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。在此之前,主流程序语言(如C/C++等)直接使用物理硬件和操作系统的内存模型,因此, 阅读全文
posted @ 2015-10-07 18:50 五月的仓颉 阅读(4770) 评论(6) 推荐(2) 编辑
摘要:前言 http://www.cnblogs.com/xrq730/p/4839245.html,HotSpot采用的是解释器+编译器并存的架构,之前的这篇文章里面已经讲过了,本文只是把即时编译器这块再讲得具体一点而已。当然,其实本文的内容也没多大意义,90%都是概念上的东西,对于实际开发、实际解决项 阅读全文
posted @ 2015-10-07 15:00 五月的仓颉 阅读(11380) 评论(4) 推荐(0) 编辑
摘要:类与类加载器 虚拟机设计团队把类加载阶段张的"通过一个类的全限定名来获取此类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为"类加载器"。类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不限定于类加载 阅读全文
posted @ 2015-09-29 20:03 五月的仓颉 阅读(7186) 评论(3) 推荐(3) 编辑
摘要:前言 我们知道我们写的程序经过编译后成为了.class文件,.class文件中描述了类的各种信息,最终都需要加载到虚拟机之后才能运行和使用。而虚拟机如何加载这些.class文件?.class文件的信息进入到虚拟机后会发生什么变化?这些都是本文要讲的内容,文章将会讲解加载类加载的每个阶段Java虚拟机 阅读全文
posted @ 2015-09-28 21:50 五月的仓颉 阅读(13837) 评论(23) 推荐(11) 编辑
摘要:前言 定位系统问题的时候,知识、经验是基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括:运行日志、异常堆栈、GC日志、线程快照、堆转储快照等。经常使用适当的虚拟机监控和分析的工具可以加快分析数据、定位解决问题的速度。 jps:虚拟机进程状况工具 首先约定一下运行的代码都是以下这段 J 阅读全文
posted @ 2015-09-27 18:48 五月的仓颉 阅读(4949) 评论(0) 推荐(0) 编辑
摘要:前言 对象的内存分配,往大的方向上讲,就是在堆上分配,少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节决定于当前使用的是哪种垃圾收集器组合,当然还有虚拟机中与内存相关的参数。垃圾收集器组合一般就是Serial+Serial Old和Parallel+Serial Old, 阅读全文
posted @ 2015-09-26 19:35 五月的仓颉 阅读(5714) 评论(7) 推荐(2) 编辑
摘要:前言 之前的文章尤其是讲解GC的时候提到了很多的概念,比如内存溢出和内存泄露、并行与并发、Client模式和Server模式、Minor GC和Full GC,本文详细讲解下这些概念的区别。 内存溢出和内存泄露的区别 1、内存溢出 内存溢出指的是程序在申请内存的时候,没有足够大的空间可以分配了。 2 阅读全文
posted @ 2015-09-26 12:42 五月的仓颉 阅读(7206) 评论(8) 推荐(4) 编辑
摘要:哪些内存需要回收? 哪些内存需要回收是垃圾回收机制第一个要考虑的问题,所谓“要回收的垃圾”无非就是那些不可能再被任何途径使用的对象。那么如何找到这些对象? 1、引用计数法 这个算法的实现是,给对象中添加一个引用计数器,每当一个地方引用这个对象时,计数器值+1;当引用失效时,计数器值-1。任何时刻计数 阅读全文
posted @ 2015-09-25 19:12 五月的仓颉 阅读(13794) 评论(9) 推荐(11) 编辑
摘要:堆溢出 Java堆唯一的作用就是存储对象实例,只要保证不断创建对象并且对象不被回收,那么对象数量达到最大堆容量限制后就会产生内存溢出异常了。所以测试的时候把堆的大小固定住并且让堆不可扩展即可。测试代码如下 运行结果 这种异常很常见,也很好发现,因为都提示了“Java heap space”了,定位问 阅读全文
posted @ 2015-09-24 21:03 五月的仓颉 阅读(6117) 评论(12) 推荐(2) 编辑
摘要:之后写的东西就会用到虚拟机参数了,现在这里汇个总自己平时用到的、看到的一些虚拟机参数。现在看不懂没关系,反正之后都会用到的: (1)-Xms20M 表示设置JVM启动内存的最小值为20M,必须以M为单位 (2)-Xmx20M 表示设置JVM启动内存的最大值为20M,必须以M为单位。将-Xmx和-Xm 阅读全文
posted @ 2015-09-22 22:21 五月的仓颉 阅读(10037) 评论(2) 推荐(3) 编辑
摘要:几个计算机的概念 为以后写文章考虑,也为巩固自己的知识和一些基本概念,这里要理清楚几个计算机中的概念。 1、计算机存储单位 从小到大依次为位Bit、字节Byte、千字节KB、兆M、千兆GB、TB,相邻单位之间都是1024倍,1024为2的10次方,即: 1Byte = 8bit 1K = 1024B 阅读全文
posted @ 2015-09-22 21:15 五月的仓颉 阅读(15544) 评论(19) 推荐(9) 编辑
摘要:前言 让我们来看一下Java的广告词,来自http://www.java.com/zh_CN/about/: 97%的企业桌面运行Java 美国有89%的桌面(或计算机)运行Java 全球有900万Java开发人员 开发人员的头号选择 排名第一的部署平台 有30亿部移动电话运行Java 100%的蓝 阅读全文
posted @ 2015-09-21 18:07 五月的仓颉 阅读(12789) 评论(11) 推荐(20) 编辑