摘自 :https://www.cnblogs.com/boycelee/p/14095080.html原创文章,转载请标明出处!https://www.cnblogs.com/boycelee/p/14095080.html目录一、背景 二、运行时内存区域概述1、官方描述 2、中文翻译 3、内存区域简述 4、运行时数据区简图 5、运行时数据区详图三、JVM线程JVM数据区域与线程关系1、官方描述 2、中文解释 3、关系图四、PC寄存器1、官方解释 2、中文翻译 3、概述 3、什么是上下文切换? 4、什么是CPU时间片? 5、为...
从Java虚拟机JVM内存结构到JMM 解析volatile与synchronized实现原理。 在面试、并发编程、一些开源框架中总是会遇到 volatile 与 synchronized 。synchronized 如何保证并发安全?volatile 语义的内存可见性指的是什么?这其中又跟 JMM 有什么关系,在并发编程中 JMM 的作用是什么,为什么需要 JMM?与 JVM 内存结构有什么区别? 本文总结出里面的核心知识点以及面试重点,图文并茂无畏面试与并发编程,全面提升并发编程内功! 最新...
1.几个计算机的概念 为以后写文章考虑,也为巩固自己的知识和一些基本概念,这里要理清楚几个计算机中的概念。 1、计算机存储单位 从小到大依次为位Bit、字节Byte、千字节KB、兆M、千兆GB、TB,相邻单位之间都是1024倍,1024为2的10次方,即:1Byte = 8bit 1K = 1024Byte 1M = 1024K 1G = 1024M 1T = 1024G2、计算机存储元件 寄存器:中央处理器CPU的一部分,是计算机中读写速度最快的存储元件,但是容量很少 内存:属于独立的一个...
在本篇中,作者大量篇幅介绍了当时较为流行的垃圾回收器,但现在Java 14都发布了,垃圾收集器也是有了很大的进步和发展,因此在此就不再对垃圾收集器进行详细的研究。但其基本的算法思想还是值得我们参考学习的。 概述第一篇笔记Java内存区域与内存溢出异常中讲到了,Java的内存划分可以分为由所有线程共享的Java堆和方法区,以及每个线程之间相互独立的程序计数器、本地方法栈、虚拟机栈。其中每个线程相互独立的部分,并不会给垃...
周志明《深入理解java虚拟机-JVM高级特性与最佳实践》读书笔记 p69-100 垃圾收集器与内存分配策略 1.垃圾收集算法: 1.1 标记-清除算法 Mark-Sweep 首先标记需要清除需要回收的对象,在标记完成后统一回收所有被标记的对象。 两个过程效率都不高。标记清除之后会产生大量不连续额内存碎片。 1.2 复制算法 将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。每次是对整个半区进行内存回收。内存分配时也不用考虑内存碎...
对象已死吗? 判断对象存活: 引用计数法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值+1;当引用失效时,计数器值-1。任何时刻计数器为0的对象就是不可能再被使用的。 主流的Java虚拟机不选用引用计数法来管理内存,最主要的原因是它很难解决对象之间相互循环引用的问题。 比如:左边为堆,右边为栈 可达性分析算法:通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索(dfs),搜索过的...
正文 垃圾收集器关注的是 Java 堆和方法区,因为这部分内存的分配和回收是动态的。只有在程序处于运行期间时才能知道会创建哪些对象,也才能知道需要多少内存。 虚拟机栈和本地方法栈则不需要过多考虑回收的问题,因为栈中每一个栈帧分配多少内存基本上是在类结构确定下来时就已知的,因此这几个区域的内存分配和回收具有确定性。 一、对象已死吗 垃圾收集器在对堆进行回收前,第一件事就是要确定堆中对象哪些还“存活”着,哪些已...
书上关于GCTimeRatio的讲解有点怪,查看Oracle的文档后重新理解了下 -XX:GCTimeRatio 运行时间 / GC时间 当GCTimeRatio为19时,运行时间是GC时间的19倍,也就是GC时间不能超过 1 / (1 + 19) = 0.05 附上Oracle的文档原文-XX:GCTimeRatio=nnn A hint to the virtual machine that its desirable that not more than 1 / (1 + nnn) of the application execution time be spent in the collector. For example -XX:GCTimeRatio=19 se...
作者:平凡希 原文地址:https://www.cnblogs.com/xiaoxi/p/7518259.html 一、什么是Java内存模型 Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。在此之前,主流程序语言(如C/C++等)直接使用物理硬件和操作系统的内存模型,因此,会由于不同平台上内存模型的差异,有可能导致程序在一套平台上并发完...
原文链接:https://blog.csdn.net/zhangren07/article/details/62708421. JVM体系结构 图1 JVM体系结构 方法区:存放JVM加载的类型信息。包括: 类型基本信息,常量池,字段信息,方法信息,类变量,指向ClassLoader的引用,Class类的引用,方法表等。 (对应JVM内存配置中的-PermSize等) java堆:程序中创建的类的实例和数组,包括class对象和exception对象,存放在堆里面。堆中除了存储对象的实例数据外,还要存储该...
前言....... 首先通过一张图了解 Java程序的执行流程: 我们编写好的Java源代码程序,通过Java编译器javac编译成Java虚拟机识别的class文件(字节码文件),然后由 JVM 中的类加载器加载编译生成的字节码文件,加载完毕之后再由 JVM 执行引擎去执行。在加载完毕到执行过程中,JVM会将程序执行时用到的数据和相关信息存储在运行时数据区(Runtime Data Area),这块区域也就是我们常说的JVM内存结构,垃圾回收也是作用在该区域。...
《深入理解 Java 虚拟机》学习笔记 -- 内存区域 运行时数据区域 主要分为 6 部分:程序计数器 虚拟机栈 本地方法栈 Java 堆 方法区如图所示:程序计数器(线程私有)程序计数器是当前线程所执行字节码的行号指示器 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令 为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器 执行 Java 方法,计数器记录的是正在执行的虚拟机字节...
3.1 概述 说起垃圾收集,大部分人都把这项技术当做Java语言的伴生产物。事实上,GC的历史比Java救援,1960年诞生的MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。当Lisp还在胚胎时期时,人们就思考GC需要完成的3件事:哪些内存需要回收? 什么时候回收? 如何回收?经过半个世纪的发展,目前内存的动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,那么为什么还需要了解GC和内存分配呢?答案...
一、概述Java虚拟机规范规定的java虚拟机内存其实就是java虚拟机运行时数据区,其架构如下:其中方法区和堆是由所有线程共享的数据区。虚拟机栈,本地方法栈和程序计数器是线程隔离的数据区。二、详解下面来具体介绍这几个数据区。1、程序计数器程序计数器是一块较小的内存空间,其作用可以看作是当前线程所执行的字节码的行号指示器。字节码解析器工作时通过改变程序计数器的值来选取下一条需要执行的字节码指令。程序的分支、循环...
我最近在应用程序中遇到了一些OutOfMemory错误.是否有可能提前检测到虚拟机内存不足?换句话说,在它们实际发生之前先抢先处理OutOfMemory错误?解决方法:Java(从Java 5开始)现在有一个标准的JMX bean,可用于接收低内存通知.请参阅java.lang.management.MemoryMXBean.