深入了解JVM
文章平均质量分 86
研读《深入理解Java虚拟机》,是为了对Java知识体系有一个更宏观的把握,对JVM有更全面的认识。
夏目 "
一个对coding有独特追求的人。
展开
-
JVM 之(1)运行时数据区
JVM运行时数据区线程私有的数据区程序计数器程序计数器(Program Counter Register) 是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条执行字节码指令。JVM的多线程是通过线程轮流切换并分配处理器来实现的,对于我们来说的并行事实上一个处理器也只会执行一条线程中的...原创 2018-06-03 21:12:41 · 7434 阅读 · 1 评论 -
JVM 之(2)对象的创建、内存布局、访问定位
对象的创建1.类加载检查 普通对象的创建过程:虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那么必须先执行相应的类加载过程。2.分配内存 分配内存时主要注意两个问题:1.如何分配空间。2.修改指针时如何实现线程安全。 jvm为实例对象分配空间主要有两种方法 ...原创 2018-06-03 21:26:11 · 3426 阅读 · 0 评论 -
JVM 之(3)判断对象是否存活(引用技术法、可达性分析法、最终判定)
堆中几乎存放着Java世界中所有的对象实例,垃圾收集器在对堆回收之前,第一件事情就是要确定这些对象哪些还“存活”着,哪些对象已经“死去”(即不可能再被任何途径使用的对象)1、引用计数算法(Reference Counting) 很多教科书判断对象是否存活的算法是这样的:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器减1;任何时刻计数器都为0的对...原创 2018-06-03 23:02:42 · 9086 阅读 · 0 评论 -
JVM 之(4)垃圾回收算法(标记 -清除、复制、标记-整理、分代收集)
1、标记 -清除算法(Mark-Sweep)“标记-清除”算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其缺点进行改进而得到的。 它的主要缺点有两个: (1)效率问题:标记和清除过程的效率都不高; (2)空间问题:...原创 2018-06-04 10:06:50 · 31483 阅读 · 14 评论 -
JVM 之(5)垃圾收集器
Serial收集器 串行收集器是最古老(JDK1.3.1之前),最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收。新生代、老年代使用串行回收;新生代复制算法、老年代标记-整理;垃圾收集的过程中会Stop The World(服务暂停) 优点:简单高效,拥有很高的单线程收集效率 应用:Client模式下的默认新生代收集器 参数控制:-XX:+UseSeri...原创 2018-06-04 16:02:58 · 2897 阅读 · 0 评论 -
JVM 之(6)垃圾收集器总结
1、垃圾收集器的组合JAVA垃圾收集器一共有7个,减去还没有正式大规模使用的G1,还有6个,其中新生代3个,老生代3个。因为垃圾收集器都是一组一组的工作,这6个收集器一共构成了5中使用模式。参数描述-XX:+UseSerialGCJvm运行在Client模式下的默认值,打开此开关后,使用Serial + Serial Old的收集器组合进行内存回收-XX:+UseParNewGC打开此开关后,使用...转载 2018-06-04 16:10:42 · 388 阅读 · 0 评论 -
JVM 之(7)内存分配
堆内存划分为 新生代(Eden空间、Survivor空间)和 老年代(Tenured/Old 空间)。1.对象优先在Eden分配大多是情况下,对象在新生代Eden区中分配。当Eden区中没有足够空间进行分配时,虚拟机将发起一次Minor GC-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 打印gc日志 -Xms20M -Xmx20M...原创 2018-06-05 12:49:58 · 8601 阅读 · 0 评论 -
JVM 之(8)虚拟机监控工具(命令行)
1.jps (Java Virtual Machine Process Status Tool) 用来查看基于HotSpot的JVM里面中,所有具有访问权限的Java进程的具体状态, 包括进程ID,进程启动的路径及启动参数等等,与unix上的ps类似,只不过jps是用来显示java进程,可以把jps理解为ps的一个子集。 jps [options] [hostid] 如果不指...原创 2018-06-05 18:34:22 · 2271 阅读 · 0 评论 -
JVM 之(9)虚拟机监控工具(可视化)
1、Jconsole 从Java 5开始 引入了 JConsole。JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行。您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码。(1)启动 目录在 jdk\bin\jconsole.ex...原创 2018-06-06 14:10:45 · 9983 阅读 · 1 评论 -
JVM 之 (10)Class文件结构
Class文件是一组以8位字节为基础单位的二进制流,包含多个数据项目(数据项目的顺序,占用的字节数均由规范定义),各个数据项目严格按照顺序紧凑的排列在Class文件中,不包含任何分隔符,使得整个Class文件中存储的内容几乎全部都是程序运行的必要数据,没有空隙。当遇到需要占用超过8位字节以上空间的数据项目时,会按照高位在前的方式分割为多个8位字节进行存储数据项目分为2种基本数据类型(以及由这两种基...转载 2018-06-09 14:23:48 · 369 阅读 · 0 评论 -
JVM 之 (11)字节码指令
加载和内存指令 记载和内存指令是用于将数据在栈帧中的局部变量表和操作数栈之间来回传输 将局部变量表加载到操作数栈:iload lload fload dload aload 将一个数值从操作数占存储到局部变量表: istore lfda 将一个常量加载到操作数栈: bipush sipush ldc ldc_w ldc2_w aconst_null iconst_m1 iconst_m1 扩充局部...原创 2018-06-09 14:24:59 · 1797 阅读 · 2 评论 -
JVM 之 (12) 类加载机制
一、Java类加载机制1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能。 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接...原创 2018-06-09 14:26:38 · 5614 阅读 · 0 评论 -
JVM 之 (13) 类加载机制——案例分析
在《JVM 之 (12) 类加载机制》一文中详细阐述了类加载的过程,并举了几个例子进行了简要分析,在文章的最后留了一个悬念给各位,这里来揭开这个悬念。建议先看完《JVM 之 (12) 类加载机制》这篇再来看这个,印象会比较深刻,如若不然,也没什么关系~~ 下面是程序代码:package jvm.classload;public class StaticTest{ public s...转载 2018-06-09 14:38:02 · 288 阅读 · 0 评论 -
JVM 之 (14) 类加载器详解和双亲委派模型
类加载器 虚拟机设计团队把类加载阶段中“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的模块称为“类加载器”。类加载器分类 启动(Bootstrap)类加载器 启动类加载器主要加载的是JVM自身需要的类,这个类加载使用C++语言实现的,是虚拟机自身的一部分,它负责...原创 2018-06-09 18:15:19 · 4032 阅读 · 0 评论 -
Java 内存溢出(java.lang.OutOfMemoryError)常见情况和总结
在解决java内存溢出问题之前,需要对jvm(java虚拟机)的内存管理有一定的认识。jvm管理的内存大致包括三种不同类型的内存区域:Permanent Generation space(永久保存区域)、Heap space(堆区域)、Java Stacks(Java栈)。其中永久保存区域主要存放Class(类)和Meta的信息,Class第一次被Load的时候被放入PermGen space区域...原创 2018-04-17 15:02:03 · 19340 阅读 · 0 评论 -
Java虚拟机是如何执行线程同步的
想介绍下synchronized的原理,但是又不知道从何下手,在网上看到一篇老外的文章,介绍了和线程同步相关的几个基础知识点。所以想把它翻译一下给大家看看。相信看过这些基础知识之后再看我后面要写的synchronized的原理就会好理解一点了。原文地址:How the Java virtual machine performs thread synchronization了解Java语言的人都知道...转载 2018-05-08 16:02:28 · 426 阅读 · 0 评论