首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    java内存模型_简述java内存模型

    什么是JMM   JMM即为JAVA 内存模型(java memory model)。...Java内存模型,就是为了屏蔽系统和硬件的差异,让一套代码在不同平台下能到达相同的访问结果。JMM从java 5开始的JSR-133发布后,已经成熟和完善起来。   ...此处的主内存和工作内存跟JVM内存划分(堆、栈、方法区)是在不同的层次上进行的,如果非要对应起来,主内存对应的是Java堆中的对象实例部分,工作内存对应的是栈中的部分区域,从更底层的来说,主内存对应的是硬件的物理内存...JVM在设计时候考虑到,如果JAVA线程每次读取和写入变量都直接操作主内存,对性能影响比较大,所以每条线程拥有各自的工作内存,工作内存中的变量是主内存中的一份拷贝,线程对变量的读取和写入,直接在工作内存中操作...因为JMM的工作内存和主内存之间存在延迟,而且java会对一些指令进行重新排序。

    1.1K21

    最新java内存模型_java内存模型

    Java内存模型 Java内存模型是每个java程序员必须掌握理解的,这是Java的核心基础,对我们编写代码特别是并发编程时有很大帮助。...由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。 1.1....Java内存模型指的就是Runtime Data Area(运行时数据区),即程序执行期间用到的数据和相关信息保存区。 1.2....Java内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。结构如下图: 1.2.1. PC程序计数器: l 每个线程对应有一个程序计数器。...Java内存模型工作示意图 1) 首先类加载器将Java代码加载到方法区 2) 然后执行引擎从方法区找到main方法 3) 为方法创建栈帧放入方法栈,同时创建该栈帧的程序计数器

    1.2K10

    Java学习笔记——内存管理Java内存管理

    Java内存管理 简介 Java虚拟机的内存管理分为以下几个运行时数据区: 方法区 堆 虚拟机栈 本地方法栈 程序计数器 其中,方法区和堆是所有线程共享的数据区,而其他的是线程隔离的数据区。...堆 Java堆,又称GC堆,是GC的管理的主要区域。在虚拟机启动时创建。主要作用是存放对象实例,几乎所有的对象实例都会存放在Java堆中。Java堆可以处于物理不连续的内存空间中,只要逻辑连续即可。...通常Java堆是可扩展的。当Java堆无法申请到所需的内存空间来存放实例,也无法扩展时,会抛出,OutOfMemoryError异常。...---- 虚拟机栈 Java虚拟机栈是线程私有的,它的生命周期与线程相同。虚拟机栈是Java方法执行的内存模型。每个方法在执行的同时会创建一个栈帧。...Java 堆里面的DirectByteBuffer 对象作为这块内存的引用进行操作。

    1.5K30

    java内存分配

    形式参数是局部变量,局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。 成员变量存储在堆中的对象里面,由垃圾回收器负责回收。...应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享.跟C/C++不同,Java中分配堆内存是自动初始化的。...Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针...堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。...这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。

    2K50

    Java内存区域

    虽然说Java实现了一套自己的内存管理机制, 这让Java程序员可以全心投入到需求开发中去, 不需要对内存做太多了的了解。...return:返回值类型为void的方法、实例初始化方法、类和接口的初始化方法 异常退出: 在方法执行过程中遇到异常(Exception),并且这个异常没有在方法内进行处理,也就是只要在本方法的异常表中没有搜索到匹配的异常处理器...Java堆(Java Heap) **.Java堆是虚拟机所管理的内存中最大的一块, 被所有线程所共享, 生命周期是随着虚拟机的, 此内存的唯一目的就是存放对象实例的. ** 上述就是堆区的重点。...Java中, 几乎所有的对象示例都会在这里分配内存。...(但是在《Java虚拟机规范》中 它表明 所有的对象示例以及数组都应该在堆上分配), 具体听谁的咱也不知道… 相关细节: 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。

    13010

    Java内存溢出

    Java内存溢出 堆溢出 大量对象占据了堆空间,而且这些对象是强引用,导致无法回收 直接内存溢出 Java的NIO支持直接内存使用,从堆外获得内存空间,由于直接内存没有被Java虚拟机完全托管,若使用不当...,容易触发直接内存溢出。...多线程导致内存溢出 线程的栈空间也是在堆外分配的,和直接内存相似,线程过多,会导致内存溢出。 永久区溢出 永久区是存放元数据的区域。如果定义了太多类型,那么永久区有可能溢出。...GC效率低下引起内存溢出 内存回收时,如果GC效率低下,那么系统的性能会收到严重的影响。...关于String的内存溢出 java.lang.String主要由3部分组成:代表字符数组的Value、偏移量offset和长度count.

    2.6K20

    java内存管理

    java虚拟机在应用在执行的过程中将自己管理的内存分为5部分: 方法区,堆,虚拟机栈,本地方法栈,程序计数器 程序计数器:是线程私有的 表示代码执行到哪里,通过改变这个计数器的值来选取下一条需要执行的字节码指令...,该内存是唯一一个不会发生内存溢出的地方如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器值则为空(Undefined...本地方法栈:略 堆:堆内存是我们比较关心的,它是gc的主要区域,是线程共享的,此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存Java堆中还可以细分为:新生代和老年代;再细致一点的有...假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离,这种分配方式称为...如果Java堆中的内存并不是规整的,已使用的内存和空闲的内存相互交错,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例

    53120

    Java内存区域

    正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。...2.2 Java 虚拟机栈 与程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期和线程相同,描述的是 Java 方法执行的内存模型。...Java 内存可以粗糙的区分为堆内存(Heap)和栈内存(Stack),其中栈就是现在说的虚拟机栈,或者说是虚拟机栈中局部变量表部分。...在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。 2.4 堆 Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。...本机直接内存的分配不会收到 Java 堆的限制,但是,既然是内存就会受到本机总内存大小以及处理器寻址空间的限制。

    1.2K20

    Java内存模型

    @126.com  ,本文尽量涵盖所有Java语言可以碰到的和内存相关的内容,同样也会提到一些和内存相关的计算机语言的一些知识,为草案。...简介      2.堆和栈    3.本机内存    4.防止内存泄漏    1.JMM简介         i.内存模型概述       Java平台自动集成了线程以及多处理器技术,这种集成程度比Java...而在Java多线程程序里面,JMM通过Java关键字volatile来保证内存的有序访问。     ...在Java程序中,内存本身是比较昂贵的资源,其实不仅仅针对Java应用程序,对操作系统本身而言内存也属于昂贵资源,Java程序在性能开销过程中有几个比较典型的可控制的来源。...这里需要知道的一点是,这一切的操作在Java语言里面都是依靠Java语言自身来操作的,因为Java针对开发人员而言,内存的管理在不需要手动操作的情况下本身存在内存的管理策略,这也是Java自己进行内存管理的一种优势

    61810

    Java内存管理

    Direct Memory直接内存:不在JVM中,Nio中的DirectByteBuffer对象通过引用Native堆中内存,避免Java堆和Native堆内存复制的方式来提升性能。...如果这部分内存加上Java内存大于服务器物理内存限制,也会导致JVM出现OOM。...理论学习 垃圾回收过程 以GC Roots为起始点搜索引用链,不可达的对象标记为需要回收。常见的GC Roots有栈中局部变量、方法区中静态变量引用的对象等。...有这么几个特点: - 分为initial mark(初始标记,找出GC Root直接关联对象,耗时很短)–>concurrent mark(并发标记,进行引用链搜索耗时很长)–>remark(重新标记...跟踪一下代码发现一个比较有意思地方:SolrCloud分布式搜索中结果由各个Shard分片结果合并排序生成,在QueryComponent中会初始化一个优先级队列用于排序,队列的大小等于用户指定的起始偏移量

    1.6K50

    Java内存模型

    转载请以链接形式标明出处: 本文出自:103style的博客 Java并发编程的艺术笔记 并发编程的挑战 Java并发机制的底层实现原理 Java内存模型 Java并发编程基础 Java中的锁的使用和实现介绍...Java并发容器和框架 Java中的12个原子操作类介绍 Java中的并发工具类 Java中的线程池 Executor框架 ---- 目录 内存模型基础 volatile的内存语义 锁的内存语义 final...Java并发 采用的是 共享内存模型,Java线程之前的通信总是隐式进行的。...2、Java内存模型的抽象结构 在Java中,所有 实例域、静态域 和 数组元素 都储存在堆内存中,堆内存在线程之前共享。 本文用 共享变量 统一描述 实例域、静态域 和 数组元素 。...Java线程通信由Java内存模型(简称 JMM)控制,JMM 决定一个线程对共享变量的写入何时对另一个线程可见。

    29120
    领券