首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

java虚拟机内存模型

GC主要做了两个工作,一个是内存的划分分配,一个是对垃圾进行回收。...关于对垃圾进行回收,被引用的对象是存活的对象,而不被引用的对象是死亡的对象也就是垃圾,GC要区分出存活的对象死亡的对象,也就是垃圾标记,并对垃圾进行回收。...目前主流的Java虚拟机没有选择引用计数算法来为垃圾标记,主要原因是引用计数算法没有解决对象之间相互循环引用的问题。...垃圾被标记后,GC就会对垃圾进行收集,垃圾收集有很多种算法 (1)标记-清除算法 缺点:(1)标记清除的效率都不高(2)容易产生大量不连续的内存碎片,碎片太多可能会导致后续没有足够的连续内存分配给较大的对象...回收后,已用未用的内存都各自一边 http://liuwangshu.cn/tags/Java%E8%99%9A%E6%8B%9F%E6%9C%BA/ 3.内存模型 线程之间的通信机制有两种:共享内存消息传递

87370
您找到你想要的搜索结果了吗?
是的
没有找到

Java虚拟机--虚拟机内存区域Java虚拟机内存区域

Java虚拟机内存区域 Java程序在JVM虚拟机中运行,当我们一个类被加载到虚拟机中时,JVM会给该类分配具体的内存空间/内存地址,而这被分配的区域就是Java虚拟机运行时内存区域。...在后续的执行过程中,Java虚拟机会用一部分内存区域来存储程序运行期间所需要用到的数据相关信息,通常我们称这部分内存区域叫做Runtime Data Area---运行时数据区,也就是我们常说的Java...栈帧是一种数据结构,用于虚拟机方法的调用执行。每一个方法的执行结束对应着栈帧的入栈出栈,入栈表示方法被调用,出栈表述方法执行完毕或者抛出异常。...这样的符号引用直接引用在运行时进行解析链接的过程,叫动态链接。 在《Java虚拟机规范(Java SE 7版本)》中,Java虚拟机栈可以被设计成固定大小或者随着程序的执行动态扩展收缩的形态。...Java虚拟机为了节省性能内存的开销,在实例化字符串时进行了一些优化,首先为字符串开辟一个字符串常量池,可以理解为缓存区。在创建字符串常量时,首先坚持字符串常量池是否存在该字符串。

2K80

JVM虚拟机内存

Java虚拟机栈:java方法执行的内存模型,每个方法被执行时都会创建一个栈帧,存储局部变量表,操作栈,动态链接,方法出口等信息。...每个线程都有自己独立的栈空间,线程栈只存储基本类型对象地址,方法中局部变量存放在线程空间中。 本地方法栈:Native方法服务,在hotspot虚拟机中和java虚拟机栈合二为一。...虚拟机本地方法区栈溢出:statkoverflowerror:线程请求的栈深度大于虚拟机所允许的最大深度,循环递归会触发这种OOM。...outfomemoryerror:虚拟机在扩展栈时无法申请到足够的内存空间,一般可以通过不停创建线程触发这种OOM。...垃圾回收系统吞吐量 吞吐量:指的是单位时间内完成的工作量的度量。 响应时间:是提交请求和返回该请求的响应之间使用的时间。 通常平均响应时间越短,系统吞吐量越大,平均响应时间越长,吞吐量越小。

62020

Java虚拟机内存管理(一)—内存划分

1、内存划分 内存是计算机中运行系统软件的场所,而内存划分是 Java 虚拟机管理内存中人为添加的概念,是为了更好的描述 Java 虚拟机内存的管理。...1.2 Java 虚拟机栈 我们常在程序运行的内存划分为堆区栈区,但是在 Java 中,这样的划分是很粗糙的,Java 虚拟机中栈有 Hava虚拟机本地方法栈。...1.3 本地方法栈 本地方法栈虚拟机栈作用是相似的,他们之间的区别无非是虚拟机栈为虚拟机执行的是 Java 方法,本地方法栈为虚拟机使用的是 Native 方法。...其实,不同的 Java 虚拟机,对栈区域的实现是不同的,比如主流的 HotSpot 虚拟机就把虚拟机本地放栈合二为一了。...直接内存是 Java 程序不经过 Java 虚拟机分配,直接使用主机的物理内存,在一些场景(如文件赋值)中可以提高性能,但是直接在使用直接内存中也要注意主机内存大小的限制(包括物理系统级的限制),否则也会抛出

83851

虚拟机的前世今生Java内存区域 顶

但是所有的知识体系这,都内存结构有一定的联系: 比如垃圾回收就是内存、类加载加载到的地方也是内存、性能优化也涉及到内存优化、执行引擎与内存密不可分、类文件结构与内存设计有关系、监控工具也会监控内存,...JVM的内存区域 运行时数据区域 在JVM中,JVM内存主要分为堆、程序计数器、方法区、虚拟机本地方法栈等 按照与现场的关系划分为: 线程私有区域、线程共享区域 直接内存:没有被虚拟化的操作系统上的其它内存...虚拟机栈是基于线程的:在线程的生命周期这,参与计算的数据会频繁的入栈出栈,栈的生命周期线程是一样的。...常量池:存放编译期间生成的各种字面量符号引用,字面量(字符串、基本类型常量(final修饰的变量)),符号引用则包括类方法的权限的名(XX/XX/XX) 符号引用 编译时不知道引用类的实际内存地址...而在类装载器装载该类时,可以通过虚拟机获取引用类的实际内存地址,也就是将符号引用替换为引用类的实际内存地址即直接引用地址。

38430

Java虚拟机内存初探

我们所说的“栈”是指Java虚拟机栈,一个栈帧中包括:局部变量表、操作数栈、动态连接、方法返回地址、附加信息 局部变量表 主要是存储方法中的局部变量,包括方法中局部变量的信息方法的参数。...,只不过Java虚拟机规范中也允许固定长度的虚拟机栈),如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。...与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowErrorOutOfMemoryError异常。...Java中的堆是用来存储对象本身的以及数组(当然,数组引用是存放在Java栈中的),几乎所有的对象实例都在这里分配内存。...五、方法区 方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、以及编译器编译后的代码等。

43420

Java虚拟机--内存模型

Java虚拟机的即时编译器中也有类似的指令重排序优化。 Java内存模型: 内存模型可以理解为:在特定操作协议下,对特定的内存或缓存进行读写访问的过程抽象。...Java内存模型的主要目标是定义程序中的各个变量的访问规则,即在虚拟机中将变量存储在内存内存中读取变量这样的底层细节。...如果把一个变量从主内存复制到工作内存,必须顺序执行readload操作;反之将一个变量从工作内存回写到主内存,storewrite也要顺序执行。...unlock操作必须在storewrite之后。 对volatile型变量的特殊规则: 关键字volatile可以说是Java虚拟机提供的最轻量级的同步机制。...但根据上述严谨的定义去判断,实践起来比较麻烦,所以通常可以根据一个定义等效的判断原则----先行发生原则,来判断一个访问在并发情况下是否安全。 下一篇:Java虚拟机--先行发生原则

52250

java虚拟机内存大小_jvm内存分布

目录 一、虚拟机 二、虚拟机组成 1.栈 栈帧 2.程序计数器 3.方法区 对象组成 4.本地方法栈 5.堆 GC GC案例 ---- 一、虚拟机 ​ 同样的java代码在不同平台生成的机器码肯定是不一样的...二、虚拟机组成 ​ 1.栈 我们先讲一下其中的一块内存区域栈,大家都知道栈是存储局部变量的,也是线程独有的区域,也就是每一个线程都会有自己独立的栈区域。...大家都知道每个方法都有自己的局部变量,比如上图中main方法中的math,compute方法中的a b c,那么java虚拟机为了区分不同方法中局部变量作用域范围的内存区域,每个方法在运行的时候都会分配一块独立的栈帧内存区域...对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)对齐填充(Padding)。...(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位64位的虚拟机(未开启压缩指针)中分别为32bit64bit,官方称它为“MarkWord

1.1K30

VirtualboxVMware 内存不足修改虚拟机镜像大小

如果以后想要在虚拟机硬盘上有更多空间,则必须扩大虚拟硬盘分区。 请注意,您可能希望在执行这些操作之前备份您的虚拟硬盘文件 - 总是有可能出现问题,因此备份总是好的。然而,这个过程对我们来说很好。...首先,关闭虚拟机 - 确保其状态设置为已关闭,而不是已保存。 (在继续之前, 如果您使用 VirtualBox 中的快照功能,您还应该删除与虚拟机关联的任何快照。...VMware 在 VMware 中扩大虚拟磁盘 要在 VMware 中放大虚拟机的硬盘,请关闭虚拟机电源,右键单击它,然后选择虚拟机设置。...通过进入虚拟机的设置窗口,选择您的虚拟 CD 驱动器,然后浏览到您计算机上的 ISO 文件,将 ISO 文件加载到您的虚拟机中。...您可以在单独的分区上访问其他硬盘的内容——例如,如果您使用的是 Windows 虚拟机,则可以在虚拟机内的不同驱动器号上访问其他虚拟硬盘。

3.9K30

Java虚拟机内存管理(三)—内存异常

——《深入理解Java虚拟机:JVM高级特性与最佳时实践(第二版)》周志明 Java 虚拟机作为运行 Java 程序抽象出来的计算机,具有内存管理的能力,像内存分配、垃圾回收等这些相关的内存管理问题...,Java 虚拟机都会帮我们解决,所以作为一个 Java 程序员要比 C++ 程序员幸福,但是内存方面一旦出现问题,如果对虚拟机怎样使用内存不了解,就很难排查错误。...在使用 MAT 内存分析器工具之前,我们还要知道内存泄露内存溢出的区别,我在前面没有将 OutOfMemoryError 异常翻译成内存泄露异常或内存溢出异常,而是使用原本的英文,内存泄露内存溢出只是导致出现异常的原因...内存泄露内存溢出的区别: 内存泄露是指程序在申请内存后,无法释放已申请的内存空间,内存泄露会导致内存资源耗光,通俗的说就是对象占着内存空间不归还给系统。...查看泄露对象到GCRoots的引用链.gif 3.2 栈内存异常 在 HotSpot 虚拟机中并不区分 Java 虚拟机本地方法栈,栈的容量可以通过 -Xss 参数来设定。

67331

Java虚拟机内存区域详解

总共也就这么 5 个区(直接内存不属于 JVM 运行时数据区的一部分),除了程序计数器其他的地方都有可能出现 OOM (OutOfMemoryError),其中像是程序计数器两个栈(Java 虚拟机栈...将直接内存放在这里讲解的原因是它也可能会出现 OutOfMemoryError; 服务器管理员在配置 JVM 参数时,会根据机器的实际内存设置 -Xmx 等信息,但经常会忽略直接内存(默认等于 -Xmx...HotSpot 虚拟机堆中的对象 这一小节将对 JVM 对 Java 堆中的对象的创建、布局访问的全过程进行讲解。...:句柄访问直接指针访问。...句柄访问 句柄访问会在 Java 堆中划分一块内存作为句柄池,每一个句柄存放着到对象实例数据对象类型数据的指针。

73520

浅谈 Java 虚拟机内存

由于使用反射机制的原因,虚拟机很难推测哪那个类信息不再使用,因此这块区域的回收很难。 静态块非静态块有什么区别? 类(Class)对象(Object)的区别与联系?...制造方法区内存溢出,注意,必须在 JDK1.6 及之前版本才会导致方法区溢出,原因后面解释,执行之前,可以把虚拟机的参数 -XXpermSize -XX:MaxPermSize 限制方法区大小。...与虚拟机栈一样,本地方法栈也会抛出 StackOverflowError OutOfMemoryError 异常。...程序计算器的运用 通过 -Xmx -Xms 控制 六、直接内存(Direct Memory) 什么是直接内存与非直接内存?...服务器管理员配置虚拟机参数时,一般会根据实际内存设置 -Xmx 等参数信息,但经常会忽略掉直接内存,使得各个内存区域的总和大于物理内存限制(包括物理上的操作系统级的限制),从而导致动态扩展时出现 OutOfMemoryError

54710

Java虚拟机--对象内存布局

HotSpot虚拟机下,一个对象在内存中包含了3大区域,分别为:对象头(Header)、实例数据(Instance Data)对齐填充(Padding)。...在HotSpot虚拟机中,对象头包括两部分:Mark Word类型指针。 那么,什么是Mark Word呢?什么是类型指针呢?...考虑到虚拟机的存储空间,Mark Word被设计成一个非固定的数据结构以便在最小的内存中存储更多的有用信息。 对于Mark Work来说,在不同场景下存储着不一样的信息。...(2)类型指针 类型指针:对象指向其类元数据的指针,虚拟机通过这个指针确定该对象是哪个类的实例。...原生类型(primitive type)的内存占用如下: 原生类型 占用内存大小(字节) boolean 1 byte 1 short 2 char 2 int 4 float 4 long 8 double

87660

Java 虚拟机 :Java内存模型

文章收录地址:Java-Bang 专注于系统架构、高可用、高性能、高并发类技术分享 JVM 虚拟机.jpg 我们先来看一个反常识的例子。...在多线程环境下,假设这两个方法分别跑在两个不同的线程之上,如果 Java 虚拟机在执行了任一方法的第一条赋值语句之后便切换线程,那么最终结果将可能出现(0,0)的情况。...另外,如果两个操作之间存在数据依赖,那么即时编译器(处理器)不能调整它们的顺序,否则将会造成程序语义的改变。...在文章开头的例子中,method1 method2 之中的代码均属于先读后写(假设 r1 r2 被存储在寄存器之中)。...实际上,在解锁时,Java 虚拟机同样需要强制刷新缓存,使得当前线程所修改的内存对其他线程可见。 需要注意的是,锁操作的 happens-before 规则的关键字是同一把锁。

1.5K30

Java虚拟机内存分区域与内存溢出异常

java虚拟机所管理的内存分为以下几个运行时数据区域。 Ⅰ程序计数器:当前线程所执行的字节码的行号指示器。...这类伴随线程存储的内存区域,称为线程私有的内存。 ⅡJavax虚拟机栈:很多刚学Java的学生通常会把Java内存区域分为堆栈,这种分法比较粗糙,其中所指的栈就是现在所看的虚拟机栈。...举个例子说就是,在Java虚拟机运行一个方法时,方法内部的变量就是存储在Java虚拟机栈这个内存区域中,当然也是伴随这个方法的结束,其中的内存就释放了,也就是伴随着线程的内存区域,时线程私有的。...Ⅲ本地方法栈:与上面所看的Java虚拟机栈作用时一样的,这个内存区域时为虚拟机使用到的Native方法而服务的,显然易见,Java虚拟机栈是为虚拟机执行Java方法而服务,也就是字节码服务。...重点说下,关于这里的内存溢出问题,Java堆空间扩展方法, 通过-Xmx -Xms 控制,最好时设置成最小的最大空间一样,并且为物理内存的四分之一。显而易见,对象实例存放的内存时线程共享的。

55420

Java虚拟机内存结构(JVM)

JDKJava核心类库 JVM:java Virtual Machine,即Java虚拟机 简化版 完整版 JVM内存结构 JVM内存主要分为堆、虚拟机栈、本地方法栈、方法区、程序计数器等。...同时,永久代堆是相互隔离的,但它们使用的物理内存是连续的。 永久代的垃圾收集是老年代捆绑在一起的,因此无论谁满了,都会触发永久代老年代的垃圾收集。...(锁锁块内的对象不会逃逸出线程就可以把这个同步块取消)。 虚拟机栈(Java stack) Java虚拟机栈属于线程私有的,生命周期线程相同。...虚拟机栈描述方法的执行过程,每个栈帧对应一个方法的入栈出栈,包含局部变量、操作数栈、动态链接方法出口。 本地方法栈则是用于执行本地方法的。...虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。甚至有的虚拟机(譬如Sun HotSpot虚拟机)直接就把本地方法栈虚拟机栈合二为一。

47910

JVM虚拟机内存模型

栈也叫栈内存,主管java程序的运行,是在线程创建时创建,它的生命周期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题,只要线程一结束该栈就结束,生命周期线程一致,是线程私有的...基本类型的变量对象的引用变量都保存在栈中。 栈存储什么? 栈帧中主要保存3类数据 本地变量:输入参数输出参数以及方法内变量; 栈操作:记录出栈、入栈的操作; 栈帧数据:包括类文件、方法等。...栈中的数据都是以栈帧的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法运行期数据的数据集,当一个方法A被调用时就产生了一个栈帧F1,并被压入栈中,A又调用B方法,于是产生栈帧F2并压入栈中,...Java虚拟机多线程是通过线程轮流切换并分配处理器执行时间的方式实现的。为了线程切换能恢复到正确的位置,每条线程都需要一个独立的程序计数器,所以它是线程私有的。...五、本地方法栈 本地接口是为虚拟机使用到的Native 方法服务,因为需要融合不同的语言,比如c/c++等,java在内存中专门开辟了一块区域处理标记为native的代码。

55230
领券