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

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

Java内存管理 简介 Java虚拟机的内存管理分为以下几个运行时数据区: 方法区 堆 虚拟机栈 本地方法栈 程序计数器 其中,方法区和堆是所有线程共享的数据区,而其他的是线程隔离的数据区。...堆 Java堆,又称GC堆,是GC的管理的主要区域。在虚拟机启动时创建。主要作用是存放对象实例,几乎所有的对象实例都会存放在Java堆中。Java堆可以处于物理不连续的内存空间中,只要逻辑连续即可。...通常Java堆是可扩展的。当Java堆无法申请到所需的内存空间来存放实例,也无法扩展时,会抛出,OutOfMemoryError异常。...Java 堆里面的DirectByteBuffer 对象作为这块内存的引用进行操作。...服务器管理员配置虚拟机参数时,一般会根据实际内存设置-Xmx等参数信息,但经常会忽略掉直接内存,使得各个内存区域的总和大于物理内存限制(包括物理上的和操作系统级的限制),从而导致动态扩展时出现OutOfMemoryError

1.5K30

疯狂Java笔记之对象及其内存管理

在同一个JVM内,侮个类只对应一个 Java对象口static修饰的成员变量是Class对象,但侮个类可以创建多个 由于同一个JVM内每个类只对应一个static对象,因此同一个JVM内的一个类的类变量只需一块内存空间...也就是说,程序中有几个实例,实例变量就需要几块内存空间。 3.实例变量的初始化时机 对于实例变量,它是Java对象本身。每创建Java对象时都需要为实例变量分配内存空间,并对实例进行初始化。...从程序运行的角度来看,每个jvm对一个Java类只初始化一次,因此只有每次运行Java程序时,才会初始化该Java类,才会为该类的类变量分配内存空间,并执行初始化。...首先我们要知道Java构造器只是起到对变量进行初始化的作用,而在执行构造器之前我们的对象已经初始化了,在内存中已经被分配起来了,而这些值默认是空值。...(); } } 当创建一个对象时,系统不仅为该类的实例变量分配内存,同时也为其父类定义的所有实例变量分配内存,即是子类定义了与父类同名的实例变量。

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

    java内存管理

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

    53820

    Java 对象内存

    平常工作中,我们只new一个对象,却基本不关心这个对象到底占了我们多少空间....今天就一起看下,对象的空间占用情况 首先,内存中的对象是由以下几部分构成的: 结合上图以下类为例,看下内存空间的占用情况 public class MyObject { int i = 123...对齐补全: JVM中开辟的内存空间必须是8字节的倍数, 如果缺少位数,需要补全为8的倍数; 以上各字段共28字节,需补全4字节 所以MyObject对象共占用8+4+0+16+4=32字节 下面利用openjdk...提升执行效率 头部空间补全 在关闭指针压缩之后,在看数组对象内存空间,就可以发现产生了数据补全的情况 Mark down使用8字节 Klass pointer 使用8字节 数组长度 使用4字节 头部数据补全.../A Instance size: 40 bytes Space losses: 4 bytes internal + 0 bytes external = 4 bytes total 以上,就是一个对象内存的占用情况

    23910

    Java对象内存布局

    Java对象内存布局 一个Java对象内存中包括三部分 对象头 实例数据 补齐填充 [在这里插入图片描述] 对象对象头又分为以下三部分 Mark Word:Mark Word存储了对象的hashCode...在32位系统占4字节,在64位系统中占8字节; Class Pointer:用来指向对象对应的Class对象(其对应的元数据对象)的内存地址。...Length:如果是数组对象,还有一个保存数组长度的空间,占4个字节; 对象内存分布图 [在这里插入图片描述] 对象实际数据 对象实际数据包括了对象的所有成员变量,其大小由各个成员变量的大小决定,,比如...[在这里插入图片描述] 对齐填充 Java对象占用空间是8字节对齐的,即所有Java对象占用bytes数必须是8的倍数。...如何打印Java对象内存布局 org.openjdk.jol jol-core</artifactId

    1.2K20

    Java内存管理

    不过看了一遍《深入Java虚拟机》再来理解Java内存管理会好很多。接下来一起学习下Java内存管理吧。...下面重点解下Java内存管理中的栈和堆。 3、栈(Stacks) 在Java中,JVM中的栈记录了线程的方法调用。每个线程拥有一个栈。...因此,在某个方法中创建的对象,可以在方法调用结束之后,继续存在于堆中。这带来的一个问题是,如果我们不断的创建新的对象内存空间将最终消耗殆尽。...垃圾回收是Java的一大特征。并不是所有的语言都有垃圾回收功能。比如在C/C++中,并没有垃圾回收的机制。程序员需要手动释放堆中的内存。 由于不需要手动释放内存,程序员在编程中也可以减少犯错的机会。...在Java中,对象的是通过引用使用的(把对象相像成致命的毒物,引用就像是用于提取毒物的镊子)。如果不再有引用指向对象,那么我们就再也无从调用或者处理该对象

    46730

    Java内存管理

    RD自己的单测一路畅通,QA构造的复杂测试case果断报StackOverflowError 理论学习 简单复习一下,虚拟机运行时管理内存分为图中这几部分 这里写图片描述 程序计数器:存储当前线程执行字节码指令地址...理论上,无法申请到足够内存时,也会抛出OutOfMemoryError。64位jdk7下默认大小为1024字节。 Heap堆:对象都分配在堆上,这部分是垃圾回收管理的主要区域。...Direct Memory直接内存:不在JVM中,Nio中的DirectByteBuffer对象通过引用Native堆中内存,避免Java堆和Native堆内存复制的方式来提升性能。...如果这部分内存加上Java内存大于服务器物理内存限制,也会导致JVM出现OOM。...Copying复制算法的基本思路是将内存划分成大小相等的两块,当其中一块用完之后,将存活对象复制到另外一块。缺点是可用内存变为原来的一半,而且如果垃圾回收是对象存活率高,复制的成本相应也很高。

    1.6K50

    Java对象内存布局和对象

    Object obj = new Object(); //new 一个对象,占内存多少?...没有实例数据的话,就是16个字节 1、对象内存布局 在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding...) 2、对象在堆内存中的存储布局 Mark Word:对象标记 Class Pointer:类元信息(又叫类型指针) 对象内部结构分为:对象头、实例数据、对齐填充(保证8个字节的倍数,8、16、24...这些信息都是与对象自身定义无关的数据,所以MarkWord被设计成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据。...http://openjdk.java.net/groups/hotspot/docs/HotSpotGlossary.html http://hg.openjdk.java.net/jdk8u/jdk8u

    50220

    Java内存管理(一、内存分配)

    一、Java内存分配 1、 Java有几种存储区域?...3、Java内存模型 * Java虚拟机将其管辖的内存大致分三个逻辑部分:方法区(Method Area)、Java栈和Java堆。    ...-- Java堆分配(heap allocation)意味着以随意的顺序,在运行时进行存储空间分配和收回的内存管理模型。         堆中存储的数据常常是大小、数量和生命期在编译时无法确定的。...Java对象内存总是在heap中分配。 4、Java内存分配实例解析 常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。...堆是在 Java虚拟机启动时创建的。”      可以看出JVM主要管理两种类型的内存:堆和非堆。

    3.4K30

    面向对象Java开发——对象内存原理和内存

    在使用Java开发时,面向对象是重点和难点,而要理解面向对象的问题,最重要的还是要搞清楚其在内存中的原理和内存图,本文记录了Java对象内存中的情况,包括this,基本数据类型和引用数据类型以及局部变量和成员变量的原理...目录 预备知识 一、一个对象内存图 二、多个对象内存图 注意 三、两个引用指向同一个对象内存图 四、this的内存原理 五、基本数据类型和引用数据类型的区别 六、局部变量和成员变量的区别 ----...一、一个对象内存图 创建一个对象,要经历以下7个步骤 加载class文件 申明局部变量 在堆内存中开辟一个空间 默认初始化 显示初始化 构造方法初始化 将堆内存中的地址值赋值给左边的局部变量 比如说运行代码...二、多个对象内存图 同理,如果要处理不止一个对象,那么也来举个例子,比如说有两个对象,只要出现new,就说明要创建一个对象,在堆空间内开辟块空间,创建几个就开辟几块,且相互独立。...,也能通过001也能找到堆内存的空间,相当于就是两个变量都指向了同一个对象

    86420

    Java自动内存管理

    一、Java内存区域 为了方便管理和程序执行,Java虚拟机所管理内存包括以下几个部分:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。...Java虚拟机栈:Java方法执行的内存模型,每个方法从调用到执行完毕,就对应一个栈帧在虚拟机栈中入栈到出栈的过程。线程私有。...大对象直接进入老年代 大对象是指需要大量连续内存空间的Java对象,大对象对虚拟机分配来说是个坏消息,比大对象更坏的消息是"朝生夕灭"的大对象。...但是Java领域都没有使用引用计数法来管理内存,主要原因是这个看似简单的算法有很多例外的情况要考虑,必须要配合大量额外处理才能保证正确的工作,比如单纯的引用计数法就很难解决对象之间相互循环引用的问题。...可达性分析算法 主流商用程序语言的内存管理子系统都是通过可达性分析算法来判断对象是否存活的。

    51710

    java内存管理(下)

    和OutOfMemoryError异常 堆 定义: 堆是用来对象内存空间,几乎所有的对象都存储在堆中 特点: 线程共享,整个Java虚拟机只有一个堆,所有线程都访问同一个堆....,可以向常量池中添加新的常量,如String类的intern()方法就能在运行期间向常量池中添加字符串常量 直接内存(堆外内存) 直接内存是除Java虚拟机之外的内存,但有可能被Java使用 操作直接内存...: 在NIO中引入了一种基于通道和缓存的IO方式,他可以调用本地方法的直接分配Java虚拟机之外的内存,然后通过一个存储在堆中的DirectByteBuffer对象直接操作该内存,而无需将外部内存中数据复制到堆中再进行操作...直接内存的作用链:本地IO–>直接内存–>本地IO 堆内存的作用链:本地IO–>直接内存–>非直接内存–>直接内存—>本地IO 服务器管理员在配置虚拟机参数时,会根据实际内存设置 -Xmx等参数信息,...对象的堆内存由成为垃圾回收器的自动内存管理系统回收 非堆内存分配: ①:JVM使用-XX:PermSize 设置非堆内存的初始值,默认物理内存的1/64; ② :由XX:MaxPermSize设置设置最大非堆内存的大小

    36110

    java内存管理(上)

    一.简介 可以分几部分回答这个问题,首先JVM内存划分 | JVM垃圾回收的含义  |  有哪些GC算法  以及年轻代和老年代各自特点等等。...二.java内存划分 方法区 (线程共享)  常量  静态变量  JIT(即时编译器)编译后代码也在方法区存放 堆内存(线程共享) 垃圾回收的主要场地 程序计数器  当前线程执行的字节码的位置指示器 Java...虚拟机栈(栈内存) :保存局部变量,基本数据类型以及堆内存对象的引用变量 本地方法栈  (C栈):为JVM提供使用native方法的服务 通过这幅图了解一下 JDK 1.8同JDK 1.7 最大的区别是...生命周期:随着线程的创建而创建,随着线程的销毁而销毁 是一个唯一不会出现的OutOfMemoryError的内存区域 Java虚拟机栈 定义: 描述Java方法运行过程的内存模型 Java虚拟机栈会为每一个即将运行的...Java虚拟机栈的最大深度是,就会抛出此异常 OutOFMemoryError,若允许动态扩展,那么当前线程的请求的栈内存用完了,无法再动态扩展时,抛出此异常 Java虚拟机栈也是线程私有,随着线程创建而创建

    69410

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

    JVM内存结构 我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理内存划分为若干个不同的数据区域,这些区域都有各自的用途。...Java虚拟机规范并没有定义这块内存区域,所以他并不由JVM管理,是利用本地方法库直接在堆外申请的内存区域。 6、堆和栈的数据划分也不是绝对的,如HotSpot的JIT会针对对象分配做相应的优化。...如上,做个总结,JVM内存结构,由Java虚拟机规范定义。描述的是Java程序执行过程中,由JVM管理的不同数据区域。各个区域有其特定的功能。...这就是一个简单的Java对象的OOP-Klass模型,即Java对象模型。 总结 我们再来区分下JVM内存结构、 Java内存模型 以及 Java对象模型 三个概念。...JVM内存结构,和Java虚拟机的运行时区域有关。 Java内存模型,和Java的并发编程有关。 Java对象模型,和Java对象在虚拟机中的表现形式有关。

    1.2K32

    JVM内存管理------JAVA语言的内存管理概述

    引言 内存管理一直是Java语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑。...它随着JAVA虚拟机的启动创建,储存着所有对象实例以及数组对象,而且内置了“自动内存管理系统”,也就是我们常说的垃圾搜集器(GC)。...它与JAVA堆的区别除了存储的信息与JAVA堆不一样之外,最大的区别就是这一部分JAVA虚拟机规范不强制要求实现自动内存管理系统(GC)。...内存管理 内存管理分为内存分配和内存释放,看一下上面的五个内存区域,其实可以大致分为两部分,一部分是全局共享,一部分是线程独有。...这一部分内存,不需要垃圾搜集器的管理,而是JAVA虚拟机来主动管理,每当一个线程被创建的时候,JAVA虚拟机就会为其分配相应的PC寄存器和JAVA虚拟机栈,如果需要的话,还会有本地方法栈。

    93270

    承前启后,Java对象内存布局和对象

    承前启后,Java对象内存布局和对象头大家好,我是小高先生。在我之前的一篇文章《并发编程防御装-锁(基础版)》中,我简要介绍了锁的基础知识,并解释了为什么Java中的任何对象都可以作为锁。...在那里,我提到了对象头中有一个指向ObjectMonitor的指针,但没有深入探讨Java对象内存结构。...HotSpot虚拟机的自动内存管理系统要求对象的起始地址必须是8字节的整数倍,也就是对象的大小是8字节的整数倍。...JOL有关Java对象布局的理论知识已经学完了,那能不能从代码层面验证一下对象的结构呢。JOL(Java Object Layout)是一个专门用于分析Java虚拟机(JVM)中对象内存布局的工具箱。...总结本文和朋友们一起学习Java对象内存布局的知识,对象对象头、实例数据和对齐填充组成。

    17810

    内存管理:判断对象是否存活

    Component Object Model)技术、使用 ActionScript3 的 FlashPlayer、Python 语言以及在游戏脚本领域得到许多应用的 Squirrel 中都使用了引用计数算法进行内存管理...但是,在 Java 领域,至少主流的 Java 虚拟机里面都没有选用引用计数算法进行内存管理,主要原因是,这个看似简单的算法有很多例外情况要考虑,必须要配合大量的额外处理才能保证正确地工作,譬如单纯的引用计数就很难解决对象之间相互循环引用的问题...System.gc(); }}可达性分析算法当前主流的商用程序语言(Java、C#,上溯至古老的 Lisp)的内存管理子系统,都是通过可达性分析(Reachability Analysis)算法来判断对象是否存活...譬如后文将会提到的分代收集和局部回收(Partial GC),如果只针对 Java 堆中某一块区域发起垃圾收集时(如最典型的只针对新生代的垃圾收集),必须考虑到内存区域是虚拟机自己的实现细节(在用户视角里任何内存区域都是不可见的...参考资料《深入理解 Java 虚拟机》第 3 章:垃圾收集器与内存分配策略 3.2 对象已死?

    42820

    类与对象下 与 内存管理

    类与对象下 1....匿名对象 • ⽤类型(实参)定义出来的对象叫做匿名对象,相⽐之前我们定义的类型对象名(实参)定义出来的 叫有名对象 • 匿名对象⽣命周期只在当前⼀⾏,⼀般临时定义⼀个对象当前⽤⼀下即可,就可以定义匿名对象...内存管理 1.内存成员 从上往下依次是 1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。 2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。...用户可使用系统接口 创建共享共享内存,做进程间通信。(Linux课程如果没学到这块,现在只需要了解一下) 3. 堆用于程序运行时动态内存分配,堆是可以上增长的。 4....代码段--可执行的代码/只读常量 2.malloc/calloc/realloc/free与new/delete 我们原有的C语言 使用malloc calloc realloc 与 free来解决内存的申请和释放

    9610

    内存管理--35:僵尸对象(Zombie Object)

    僵尸对象 已经被销毁的对象,我们就称这个对象为“僵尸对象” 野指针 当一个指针指向一个僵尸对象,我们就称为这个指针为野指针 只要给一个野指针发送消息就会报错 空指针 没有指向存储空间的指针(里面存的是nil...,也就是0) 为了避免给野指针发送消息会报错,一般情况,当一个对象被释放后我们就会将这个对象的指针置为空指针 注:在OC中,给空指针发送消息是不会报错的 用“僵尸对象”调试内存管理问题 程序若有内存问题就会导致程序偶尔崩溃...其问题的根本原因取决于对象所占的内存有没有被其他内容所覆写,而这块内存有没有移作他用,又无法确定,所以导致程序偶尔崩溃。...“僵尸对象”调试内存管理问题最佳方式 iOS中,提供了僵尸对象(zombie)调试功能,开启这项调试功能,如果出现内存管理问题,运行期系统会把所有已经回收的问题实例对象转化为特殊的“僵尸对象”,而不会真正回收它们...开启调试的方式: 在Xcode编辑器设置僵尸对象 举个例子 未开启“僵尸对象”调试 未开启“僵尸对象”调试 开启“僵尸对象”调试

    25110

    java基础_面向对象_内存分析

    Hello小伙伴们~今天兔妞兔君都好忙,所以给大家分享的是同事帅GG的投稿呢~主要讲的就是面向对象的设计思想、Java中类和对象的定义以及类加载的内存分析。 面向对象的设计思想 ?...首先说明一点,面向对象Java的重中之重,面向对象的设计思想本身不是特别难理解但是想要用的特别好,需要长时间的锤炼才行。那么面向对象到底是啥?...类和对象的关系:类可以看成一类对象的模板,而对象可以看成该类的一个具体实例。 类与类之间是有这不同的关系,是Java体系中最常见的知识。 继承:一般和特殊的关系。...类加载的内存分析 ? Java中的对象是通过引用对其操作的。理解了内存就理解了一切。先看最简单的代码: String s ;//声明了一个String类型的应用变量。但并没有使它指向一个对象。...补充:构造函数 使用new+构造方法创建一个新的对象 构造函数是定义在Java类中一个用来初始化对象的函数。 构造函数与类同名且没有返回值。

    44810
    领券