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

JVM内存管理、直接内存垃圾回收

无论对于Java程序员还是大数据研发人员,JVM是必须掌握的技能之一。既是面试中经常问的问题,也是在实际业务中对程序进行调优、排查类似于内存溢出、栈溢出、内存泄漏等问题的关键。...笔者将按下图分多篇文章详细阐述JVM: 1.jpg 本篇文章主要叙述JVM内存管理、直接内存、垃圾回收常见的垃圾回收算法: 运行时数据区域 JVM在执行一些基于JVM运行的程序,典型的如Java...这些区域有各个的作用、创建和销毁时间,有的区域生命周期依赖于用户线程的启动结束,有些区域则随着虚拟机的启动而存在,下图展示了JVM在运行时的数据区域划分: 2.jpg 1....垃圾收集 垃圾收集即GC,是JVM进行内存回收的处理过程。 开发人员更多的是关注业务需求的实现,而内存管理是交由JVM完成的,如果不进行或者错误的进行垃圾回收会导致程序不稳定甚至崩溃。...Java提供的GC功能可以自动监测对象是否超过作用域等从而达到自动回收内存的目的,可以有效防止内存泄露,有效的使用可用内存。 GC主要分为3种:minor GC、major GCfull GC。

1.5K00

JVM调优】----内存溢出内存泄漏

项目的开发,涉及到了服务器的运维,先来介绍下JVM相关的知识,也方便后期的使用。今天主要是说一说内存溢出内存泄漏两件事。 内存溢出 ---- 从字面上来说,溢出,什么是溢出?...用专业点的语言来说内存溢出,就是你申请内存容量的时候,系统无法给到你足够的内存容量大小,你申请了一个Integer类型的大小空间,但是你却往里面放long类型才能存的下的数据,这个时候就会内存溢出(Out...专业点的话就是说你向系统申请到了你想要的内存空间(new),但是使用完了之后却不归还(delete),结果你申请到的内存空间你自己也访问不到(也许你把地址搞丢了),系统也无法分配该空间给其他的程序。...内存泄漏没有什么明显的特征。本身不会有多么严重的伤害,也基本感觉不到内存泄漏。...但是可怕的是内存泄漏的堆积,时间长了,你的内存空间会一点点的变小,Memory leak最终会导致Out Of Memory,因为你的可用的内存空间会越来越小,可分配给其他程序的容量也越来越小,很容易就会造成

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

JVM内存泄漏内存溢出的原因

发生这种情况一般就是代码除了问题,比如写了个递归调用, Metaspace 的内存溢出一样,也很少发生。...Metaspace 保存类的基本信息,如果加载太多类就会 OOM 永久代的垃圾收集主要回收两部分内容:废弃常量无用的类。 回收废弃常量与回收 Java 堆中的对象非常类似。...虚拟机可以对满足上述3 个条件的无用类进行回收,这里说的仅仅是“可以”,而并不是对象一样,不使用了就必然会回收。 注意:方法区溢出方法区中只会产生OutOfMemoryError异常。...因为单例对象初始化后将在JVM的整个生命周期内存在,如果它持有一个外部对象(生命周期比较短)的引用,那么这个外部对象就不能被回收,而导致内存泄漏。...instance = new AppManager(); } return instance; } } 如何解决以及监控JVM

1.7K30

内存篇:JVM内存结构

所以它是一个“线程私有”的内存区域。此内存区域是唯一一个在JVM规范中没有规定任何OutOfMemoryError情况的区域。 ?...1.4 虚拟机栈(JVM Stacks) 虚拟机栈是线程私有的内存区域,生命周期与线程相同。...很多开发人员会把Java内存分为堆内存(Heap)内存(Stack),这种划分的流行只能说明大多数开发人员最关注、与对象内存分配关系最密切的内存区域是这两块,其中所指的“堆”在后面会讲到,而所指的“...同时,永久代堆是相互隔离的,但它们使用的物理内存是连续的。 永久代的垃圾收集是老年代捆绑在一起的,因此无论谁满了,都会触发永久代老年代的垃圾收集。...默认情况下元空间是可以无限使用本地内存的,但为了不让它如此膨胀,JVM同样提供了参数来限制它使用的使用。

4.2K30

JVM内存管理--计算机内存Java内存组件

JVM一向很好的帮我们管理内存,它就是一个贤内助:“向政府(内存空间)能要到地盘,还能有效的对自己的一亩三分地进行管理。”...,在linux服务器上我们经常关注swap分区,swap分区如果被经常使用,系统就会非常缓慢,表示系统内存严重不足,或者某些程序没有即时释放内存。...那么我们可以看出物理内存对于程序来说十分重要,而物理内存又会分为内核空间用户空间,内核空间保证操作程序的调度硬件的逻辑连接,我们的程序自然而然的使用的是用户空间,所以每一次调用都会存在两块空间的切换...二.线程 在用一段简单代码看JVM的执行过程 这篇文章中我们知道每个线程创建时都会创建一个私有的栈来存储数据,在HotSpot这款JVM中不区分虚拟机栈本地方法栈,栈容量大小通过-Xss设定。...我们JVM运行时要处理的数据主要关注点在运行时数据区,在下一章,我将继续学习Java内存分配结构Java内存分配策略 文章转自:https://blog.csdn.net/sureSand/article

1.1K140

JVMLinux内存的关系--进程与JVM内存空间

下面从用户内存内核内存两个方面讲解JVM进程的内存特点。 1.用户内存 上图特别强调了JVM进程模型的代码区和数据区指的是JVM自身的,而非Java程序的。普通进程栈区,在JVM一般仅仅用做线程栈。...JVM内存的使用一般进程不同。...JVM向操作系统申请一整段内存区域(具体大小可以在JVM参数调节)作为Java程序的堆(分为新生代老年代);当Java程序申请内存空间,比如执行new操作,JVM将在这段空间中按所需大小分配给Java...细心的人会发现,引言中给出两个服务器,一个SWAP最多占用了2.16g,另外一个SWAP最多占用了871m;但是,似乎我们的内存缺口没有那么大。...内存泄漏问题 另一个案例是,8g内存服务器,Linux使用800m,监控进程使用600m,堆大小设置4g;系统可用内存有2.5g左右,但是也发生了大量的SWAP占用。

2.8K21

JVM-内存泄漏内存溢出的区别?

内存泄漏内存溢出的区别? 内存泄漏(memory leak):是指程序在申请内存后,无法释放已申请的内存空间,新申请的内存在增加,而没有内存释放,迟早被占光,导致后面程序无法申请到内存。...内存溢出(out of memory):是指程序在申请内存的时候,发现没有足够的空间,导致out memeory。 JVM造成以上两种溢出的原因可能?...jvm回收; 大量的静态实例,比如很多动态放到内存内的字符串,并且还是static的; ......内存溢出(out of memory) java虚拟机堆内存不够:有可能是由于内存泄露导致一直占用着堆内存,导致新的对象无法分配到内存导致OOM; 大对象:内存中突然或者持续创建大量的大对象放到堆中,导致...OOM; 物理内存不足:由于物理内存的空间不足导致OOM; ...

1.4K30

JVM 彻底搞懂JVM内存区域及直接内存

虚拟机栈 虚拟机栈描述的是java方法执行的线程内存模型,当方法执行的时候,Java虚拟机会创建一个栈帧用于存储局部变量表、操作数栈、动态链接方法出口等信息,在每个方法种调用其他方法都是进出栈的操作,...本地方法栈 本地方法栈虚拟机方法栈作用类似,不过它是为执行native方法服务 堆 堆是被线程共享的一个内存区域,大部分对象都在堆上分配,少部分允许在栈上分配(通过逃逸分析)。...堆中有新生代老年代之分,目的是为了垃圾回收的更高效更少停顿。 方法区 方法区也是一块内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。...jdk8以前主要通过永久代实现方法区 jdk8开始 通过元空间实现方法区 通过本地内存实现 直接内存 直接内存堆内内存相对应,堆外内存就是把内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理...传统BIO 访问 直接内存访问

70720

JVM内存结构、Java内存模型Java对象模型

比如本文我们要讨论的JVM内存结构、Java内存模型Java对象模型,这就是三个截然不同的概念,但是很多人容易弄混。...可以这样说,很多高级开发甚至都搞不不清楚JVM内存结构、Java内存模型Java对象模型这三者的概念及其间的区别。甚至我见过有些面试官自己也搞的不是太清楚。...其中有些区域随着虚拟机进程的启动而存在,而有些区域则依赖用户线程的启动结束而建立销毁。在《Java虚拟机规范(Java SE 8)》中描述了JVM运行时内存区域结构如下: ?...Java内存模型 Java内存模型看上去Java内存结构(JVM内存结构)差不多,很多人会误以为两者是一回事儿,这也就导致面试过程中经常答非所为。...总结 我们再来区分下JVM内存结构、 Java内存模型 以及 Java对象模型 三个概念。 JVM内存结构,Java虚拟机的运行时区域有关。 Java内存模型,Java的并发编程有关。

1.2K32

JVM内存模型之直接内存

直接内存 又称堆外内存,也就是说这不是jvm运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域,但这部分也会被频繁的使用,而且也可能导致OOM。 堆外内存有什么优点呢?...1 减少了垃圾回收的工作,因为垃圾回收会暂停其他的工作 2 可以提高性能,避免java堆native堆(直接内存)来回复制数据。...使用场景 1.在JDK1.4之后加入了NIO,引入了一种基于通道与缓冲区的I/O方式,它可以使用Native库函数直接分配堆外内存,然后通过DirectByteBuffer对象作为这块内存的引用来进行操作...,jvm会自动对这部分的堆外内存进行回收。...2.使用jdk内部未对外公开的unsafe来直接使用堆外内存,但不会被JVM回收 例子 /** * Created by shengjk1 on 2017/8/8 * 会自动回收的 */ //-verbose

66230

JVMJVM运行时内存结构, JDK1.7 JVM内存结构, JDK1.8 JVM内存结构, JVM内存结构

1 JDK1.7结构 1.1 JVM内存图 程序计数器: 线程私有的(每个线程都有一个自己的程序计数器), 是一个指针. 代码运行, 执行命令....,Eden区两个大小严格相同的Survivor区....PermGen space 的错误,造成这个错误的很大原因就有可能是每次都重新部署,但是重新部署后,类的class没有被卸载掉,这样就造成了大量的class对象保存在了perm中,这种情况下,一般重新启动应用服务器可以解决问题...Virtual区: 最大内存初始内存的差值,就是Virtual区。 这里提到的GC咱们后续继续介绍~ 2....JDK1.8 结构 2.1 JVM运行时内存图 JDK1.8JDK1.7的jvm内存最大的区别是, 在1.8中方法区是由元空间(元数据区)来实现的,常量池移到堆中. 1.8不存在方法区,将方法区的实现给去掉了

72210

JVM内存模型

前一段时间写过一篇关于 JVM虚拟机之类加载的过程 的文章,其中讲述了Java虚拟机对类的处理。...最近听了一次部门内部有关JVM的分享,自己也顺便回顾了之前阅读《深入理解JVM虚拟机》一书中所讲述的Java虚拟机对内存的管理,再次将自己理解的JVM内存模型分享给大家。...这些区域都有各自的用途,一级创建和销毁的时间,有的区域随着虚拟机进程的启动而从在,有些区域则依赖用户线程的启动结束而简历销毁。 ?...JVM内存模型 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 运行时常量池 直接内存 ? java-memory-model 程序计数器 当前线程所执行的字节码文件的行号指示器。...而符号引用则属于编译原理方面的概念,包括了下面三类常量: 类接口的全限定名(包名+类名) 字段的名称描述符 方法的名称描述符 时常量池在JDK1.6及之前版本的JVM中是方法区的一部分,而在JDK1.7

34530

JVM 内存结构

局部变量表的所需的内存空间在编译期间完成分配,运行时不会改变大小。 虚拟机栈定义了两种异常状况:StackOverFlowError OutOfMemoryError 。...与虚拟机栈一样,也会抛出 StackOverFlowError OutOfMememoryError 异常。 4、堆 Java 堆是垃圾收集器管理的主要区域,也称为 GC 堆。...用于存放编译期生成的常量引用。 JDK 1.7 之后已经将运行时常量池从移出,在堆上开辟了一块区域存放运行时常量池。...6、直接内存 直接内存并不是虚拟机内存的一部分,也不是 Java 虚拟机规范中定义的内存区域。...jdk1.4 中新加入的 NIO,引入了通道与缓冲区的 IO 方式,它可以调用 Native 方法直接分配堆外内存,这个堆外内存就是本机内存,不会影响到堆内存的大小。

46220

JVM内存结构

Java与C++之间有一堵由内存动态分配垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。 围城这个比喻过于形象!!!...JVM内存区域 上经典图 【线程公有】:堆方法区 【线程私有】:虚拟机栈,本地方法栈,程序计数器 堆 用于对象实例的内存分配,GC的主要区域。 方法区 存储已被虚拟机加载的类信息、常量、静态变量。...字面量可以理解为实际值,int a = 8中的8 String a = "hello"中的hello都是字面量 符号引用是一个字符串,对应唯一的类,方法,或者字段(相当于唯一ID)。...【符号引用转换为直接引用】 在编译时,比如People类的符号引用为com.simple.People,当类装载器装载People类后,符号引用被转为实际内存地址,也就是直接引用。...栈帧包括: 局部变量表:用于存放方法参数方法内部定义的局部变量 操作数栈:包含任意的Java数据类型,为程序运算提供支持 动态连接:符号引用在运行时转换为直接引用(静态解析:符号引用在类加载时转换为直接引用

41220

JVM内存区域

JVM内存区域 数据区域 ?...《Java虚拟机规范》对方法区的约束是非常宽松的,除了Java堆一样不需要连续的内存可以选择固定大小或者可扩展外,甚至还可以选择不实现垃圾收集。...,这种分配方式称为“指针碰撞”; 空闲列表: 已被使用的内存空闲的内存相互交错在一起,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例...,并更新列表上的记录,这种分配方式称为“空闲列表”; 并发创建对象(非线程安全) 方案1:对分配内存空间的动作进行同步处理--实际上JVM采用CAS配上失败重试的方式保证更新操作的原子性 方案...对象的内存布局 在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)对齐填充(Padding)。

1K30

JVM内存管理

一:  首先弄明白两个概念:物理内存虚拟内存   物理内存:通常所说的RAM(随机存储器),有一个存储单元寄存器,存储计算单元执行指令的中间结果。...物理内存是真实存在的,例如:内存条   虚拟内存:利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘被称作交换空间。虚拟内存保证多个线程同时执行时可以共享同一块物理内存。...分开存放保证了操作系统用户进程之间互不影响,保证系统的稳定性,同时也便于管理。更重要的是将用户数据系统数据隔离,就能够对各个部分的数据访问进行控制。...三:内部溢出内存泄漏   内部溢出:程序再申请内存时,如果没有足够的内存空间,就会抛出out of memory          内存泄漏:  应该被垃圾回收的对象,却没有被回收,导致内存空间被浪费...检查代码,找出可能发生内存溢出的代码,就行修改        四:JVM内存分配策略   静态内存分布:在编译时就可以确定对象需要的空间大小,在编译的过程中就一次性分配内存空间,        堆内存分布

47630

jvm内存结构

JVM内存结构概览 先来看一张图: jvm主要分,堆、方法区、java栈、本地方法栈、程序计数器五个区域,其中方法区堆区是线程共享的 堆区域 堆内存JVM中最大的一块由新生代老年代组成,而新生代内存又被分成三部分...JVM会随意选取一个Survivor作为to区域,然后会在GC过程中,将Eden中存活下来的对象from中的对象拷贝到to这个区域, 防止内存碎片化,进一步清理无用对象 对Eden区域继续划分, Hotspot...程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器 JVM栈 与程序计数器一样,也是线程私有的,其生命周期线程一样...4)方法出口等 方法从调用到执行完成的过程,就对应了,一个栈帧在虚拟机栈中的入栈出栈的过程 有两种异常: 如果线程请求的栈深度大于JVM所允许的深度,将抛出StackOverflowError异常 如果栈扩展时无法申请到足够的内存...] JVM自动内存管理机制 Java永久代去哪儿了

69720

JVM内存模型

# JVM JDK版本:1.8 # 1、JVM内存区域 JVM在执行应用程序的过程中会将它管理的内存分为若干个不同的区域。其中一部分是线程私有的,一部分是线程共享的。...Java内存区域也叫做运行时数据区。JVM内存内存结果如下图所示: ---- # 2、Java代码执行流程 Java源码文件通过Java编译器生成字节码文件。...两种架构之间的区别: 1、基于栈的指令集架构: 设计实现更为简单,适用于资源受限的系统。 避开了寄存器的分配难题,使用零地址指令方式分配。 指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。...大部分情况下,基于寄存器架构的指令集往往都是以一地址指令、二地址指令三地址指令为主。 Java的HotSpot使用的是栈的指令架构。...---- # 5、JVM内存架构 方法区:存放常量信息,类信息,方法信息。 LV(Local Variables):局部变量表。 OS(Operand Stack):操作数栈。

21310
领券