jvm
文章平均质量分 86
夏目 "
一个对coding有独特追求的人。
展开
-
面试必问:Java 内存模型的3个特性
前言Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能得到一致效果的「机制及规范」。JMM与Java内存区域是两个容易混淆的概念,这两者既有差别又有联系:区别「两者是不同的概念层次」。「Java 内存模型是抽象的,它是用来描述一组规则」,通过这个规则来控制...原创 2020-04-28 19:29:07 · 5799 阅读 · 1 评论 -
Java虚拟机是如何执行线程同步的
想介绍下synchronized的原理,但是又不知道从何下手,在网上看到一篇老外的文章,介绍了和线程同步相关的几个基础知识点。所以想把它翻译一下给大家看看。相信看过这些基础知识之后再看我后面要写的synchronized的原理就会好理解一点了。原文地址:How the Java virtual machine performs thread synchronization了解Java语言的人都知道...转载 2018-05-08 16:02:28 · 425 阅读 · 0 评论 -
JVM 之 (10)Class文件结构
Class文件是一组以8位字节为基础单位的二进制流,包含多个数据项目(数据项目的顺序,占用的字节数均由规范定义),各个数据项目严格按照顺序紧凑的排列在Class文件中,不包含任何分隔符,使得整个Class文件中存储的内容几乎全部都是程序运行的必要数据,没有空隙。当遇到需要占用超过8位字节以上空间的数据项目时,会按照高位在前的方式分割为多个8位字节进行存储数据项目分为2种基本数据类型(以及由这两种基...转载 2018-06-09 14:23:48 · 366 阅读 · 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 · 1790 阅读 · 2 评论 -
JVM 之 (12) 类加载机制
一、Java类加载机制1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能。 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接...原创 2018-06-09 14:26:38 · 5610 阅读 · 0 评论 -
JVM 之 (13) 类加载机制——案例分析
在《JVM 之 (12) 类加载机制》一文中详细阐述了类加载的过程,并举了几个例子进行了简要分析,在文章的最后留了一个悬念给各位,这里来揭开这个悬念。建议先看完《JVM 之 (12) 类加载机制》这篇再来看这个,印象会比较深刻,如若不然,也没什么关系~~ 下面是程序代码:package jvm.classload;public class StaticTest{ public s...转载 2018-06-09 14:38:02 · 287 阅读 · 0 评论 -
JVM 之 (14) 类加载器详解和双亲委派模型
类加载器 虚拟机设计团队把类加载阶段中“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的模块称为“类加载器”。类加载器分类 启动(Bootstrap)类加载器 启动类加载器主要加载的是JVM自身需要的类,这个类加载使用C++语言实现的,是虚拟机自身的一部分,它负责...原创 2018-06-09 18:15:19 · 4027 阅读 · 0 评论 -
JVM 之(15)局部变量表
在《JVM 之(1)运行时数据区》提到,虚拟机栈是描述Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。本篇主要分析局部变量表的原理结构。 局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。在Java程序被编译为Class文件时,就在方法的Code属...原创 2018-06-09 21:25:45 · 8923 阅读 · 0 评论 -
JVM 之(16)方法调用
前言Java具备三种特性:封装、继承、多态。Java文件在编译过程中不会进行传统编译的连接步骤,方法调用的目标方法以符号引用的方式存储在Class文件中,这种多态特性给Java带来了更灵活的扩展能力,但也使得方法调用变得相对复杂,需要在类加载期间,甚至到运行期间才能确定目标方法的直接引用。方法调用所有方法调用的目标方法在Class文件里面都是常量池中的符号引用。在类加载的解析阶段,如果一个方法在运...原创 2018-06-09 23:20:43 · 683 阅读 · 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 · 19332 阅读 · 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 · 9974 阅读 · 1 评论 -
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 · 2264 阅读 · 0 评论 -
JVM 之(2)对象的创建、内存布局、访问定位
对象的创建1.类加载检查 普通对象的创建过程:虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那么必须先执行相应的类加载过程。2.分配内存 分配内存时主要注意两个问题:1.如何分配空间。2.修改指针时如何实现线程安全。 jvm为实例对象分配空间主要有两种方法 ...原创 2018-06-03 21:26:11 · 3425 阅读 · 0 评论 -
JVM 之(3)判断对象是否存活(引用技术法、可达性分析法、最终判定)
堆中几乎存放着Java世界中所有的对象实例,垃圾收集器在对堆回收之前,第一件事情就是要确定这些对象哪些还“存活”着,哪些对象已经“死去”(即不可能再被任何途径使用的对象)1、引用计数算法(Reference Counting) 很多教科书判断对象是否存活的算法是这样的:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器减1;任何时刻计数器都为0的对...原创 2018-06-03 23:02:42 · 9078 阅读 · 0 评论 -
Java内存模型 之 happens-before
前面分析了volatile 关键字解析,如何确认多线程调用之间的可见性?我们无法就所有场景来规定某个线程修改的变量何时对其他线程可见,但是我们可以指定某些规则,这规则就是happens-before,从JDK 5 开始,JMM就使用happens-before的概念来阐述多线程之间的内存可见性。在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-bef...转载 2018-04-13 16:50:45 · 4875 阅读 · 0 评论 -
JVM 之(4)垃圾回收算法(标记 -清除、复制、标记-整理、分代收集)
1、标记 -清除算法(Mark-Sweep)“标记-清除”算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其缺点进行改进而得到的。 它的主要缺点有两个: (1)效率问题:标记和清除过程的效率都不高; (2)空间问题:...原创 2018-06-04 10:06:50 · 31469 阅读 · 14 评论 -
JVM 之(5)垃圾收集器
Serial收集器 串行收集器是最古老(JDK1.3.1之前),最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收。新生代、老年代使用串行回收;新生代复制算法、老年代标记-整理;垃圾收集的过程中会Stop The World(服务暂停) 优点:简单高效,拥有很高的单线程收集效率 应用:Client模式下的默认新生代收集器 参数控制:-XX:+UseSeri...原创 2018-06-04 16:02:58 · 2894 阅读 · 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 · 385 阅读 · 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 · 8595 阅读 · 0 评论 -
volatile 关键字
Volatile可以看做一种轻量级的锁,但又和锁有些不同。这边看个例子,多线程执行generateSerialNumber时候,每次结果都是不同。private static volatile int serialNum = 0;public static int generateSerialNumber(){ return serialNum++;}问题出在了 serialNum+...原创 2018-04-06 17:02:20 · 2544 阅读 · 0 评论 -
JVM 之(1)运行时数据区
JVM运行时数据区线程私有的数据区程序计数器程序计数器(Program Counter Register) 是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条执行字节码指令。JVM的多线程是通过线程轮流切换并分配处理器来实现的,对于我们来说的并行事实上一个处理器也只会执行一条线程中的...原创 2018-06-03 21:12:41 · 7427 阅读 · 1 评论