堆内存

java - 基础 - 报错

喜你入骨 提交于 2019-11-30 16:24:22
记录一下= = StackOverflowError:栈内存溢出。 堆内存一般用于变量存储,临时方法执行,基本变量值,引用变量地址存储等。 OutOfMemoryError:堆内存溢出。 栈内存一般用于存储引用变量内容存储。 来源: https://www.cnblogs.com/clamp7724/p/11604188.html

堆是不连续的,生长方向是向上的,即向着内存地址增大的方向增长;栈是连续的,生长方向是向下的,即向着内存地址减小的方向增长。

北慕城南 提交于 2019-11-30 13:19:51
堆是不连续的,生长方向是向上的,即向着内存地址增大的方向增长;栈是连续的,生长方向是向下的,即向着内存地址减小的方向增长。 栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。 堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。 来源: https://www.cnblogs.com/yuanch2019/p/11592266.html

idea tomcat 内存

喜欢而已 提交于 2019-11-30 10:26:06
-Xms128m JVM初始分配的堆内存 -Xmx512m JVM最大允许分配的堆内存,按需分配 -XX:PermSize=64M JVM初始分配的非堆内存 -XX:MaxPermSize=128M JVM最大允许分配的非堆内存,按需分配 -server -XX:PermSize=128M -XX:MaxPermSize=256m 来源: CSDN 作者: 王烨潇 链接: https://blog.csdn.net/qq_33426311/article/details/80065050

HBase 中的 JVM 与 GC

天大地大妈咪最大 提交于 2019-11-30 07:53:43
HBase 中JVM基本配置 在JVM中,默认情况下会设置minimum heap size 为 1/64 可用物理内存,并为maximum heap size设置 1/4 的物理可用内存(不过在Java8 之前,默认最大是1g)。当然,我们可以通过手动指定 JVM 参数,配置JVM的内存,例如: -Xms10g -Xmx10g 在HBase 中,也可以在 hbase-env.sh 中显示指定堆内存大小,例如: # The maximum amount of heap to use. Default is left to JVM default. # export HBASE_HEAPSIZE=1G 这里有个问题是:是否要同时设置-Xms 与 -Xmx为一相同的值?若是将他们设置为同一一个固定值,则它们的优缺点有: 对于一些垃圾回收的算法,例如G1,将它们锁定为同一值会更好 不设置 -Xms可以让VM启动更快,但是接下来,需要在每轮gc 增长堆内存后,才会达到一个稳定状态。这样会导致在启动后,最开始会带来一些延迟,这个延时并不是我们在HBase中期望看到的,因为HBase提供的服务一般都是交互式服务 若是设置-Xms与-Xmx为同一值,则JVM在启动时会稍慢,不过在正常启动后,不会再有隐含的内存大小调整的情况,所以会更稳定。而在RegionServer 的进程中

关于JVM调优

无人久伴 提交于 2019-11-30 02:34:05
转 https://www.java123.vip/wp/ 备注:下图为JVM7的内存结构,JVM8的perm空间做了如下修改:Java7→Java8 Permanent→物理内存的Metaspace 后续讨论将基于JVM7的内存结构展开。 JVM为Java运行时环境,也就是Java程序运行时的数据都由JVM来管理,如何管理好这批数据就是我们日常所说的JVM调优。 可以将JVM的存储区域作如下划分(只列举了我们要分析的区域,其他区域请自行查阅资料) 我们来看一下下面的代码 我用颜色表示了上面代码在内存中存储情况。也就是局部变量存在于栈区;new的对象存在于堆区;类的定义文件存在于方法区; 栈区 栈区的特点是快,所以局部变量存在于这块区域,供CPU在执行指令的时候直接操作。 采用入栈出栈的方式来进行空间的分配与释放,遇到左括号变量进栈,遇到右括号变量出栈。 因为变量出栈后,这块区域就被释放了,所以这个局部变量在右括号外也就无法使用了。这也解释了变量的作用域问题。 我们看到的 StackOverFlow异常 就是这块区域空间已满,由于遇到右括号就会释放空间,所以这块区域很少会因为单纯的一个方法内变量多导致这个异常。 一般是因为方法的递归调用层次太深,导致所有的局部变量都没有释放,继而出现StackOverFlow异常。 我们可以通过设置 -Xss 参数来制定这块空间的大小。 堆内存

堆学习---1 宏观观察

倖福魔咒の 提交于 2019-11-29 23:48:51
动态内存的分配和释放最重要的就是malloc 和 free 这两个函数 一个是用于向操作系统索取动态的内存空间 一个是用于释放之前通过malloc或者relloc函数分配的空间。其 内部通过brk,sbrk和mmap 实现对内存的索取。 举个例子 当malloc(1024)的时候 即我们只需要1024Bytes,但是进程会向操作系统先批发一块大的内存块,又因为是主线程所以称为 main arena 它是一块非常大的 连续内存区域 紧邻在bss,即未初始化数据的下方 下面的图直接展示了它是在主线程的下方 开辟了 132KB大的空间 。之后的再次提交malloc之类的动态内存申请的时候,就会 先使用该arena直到消耗完这片连续的内存区域 。 当消耗完该块arena后,程序可以通过增加相应的 break location 即数据段高度(通过brk()和sbrk()实现) 并且会伴随着 Top Chunk 的变化 当使用free函数释放内存的时候 堆区域并不会立即被释放掉 而是会被添加这个 被free的区块到main arena的bin中 在glibc中 释放所需的数据结构跟bin这个数据结构有关 。 当之后用户再次请求动态内存的时候就不必先向操作系统提交请求,而是先从bin中找有木有合适的chunk,当区块均不合适的时候,才会向操作系统提交申请 多线程下的heap段

JVM参数查看与设置

你说的曾经没有我的故事 提交于 2019-11-29 16:18:15
1 JVM内存管理的机制 1.1 堆(Heap)和非堆(Non-heap)内存 按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。 可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的, 所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。 1.1.1 堆内存分配 JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制; 空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx 相等以避免在每次GC 后调整堆的大小。 说明:如果-Xmx 不指定或者指定偏小,应用可能会导致java.lang.OutOfMemory错误,此错误来自JVM,不是Throwable的,无法用try...catch捕捉。 1.1.2 非堆内存分配 JVM使用-XX

Java 堆外内存回收原理

喜欢而已 提交于 2019-11-29 08:56:42
堆外内存简介 DirectByteBuffer 这个类是 JDK 提供使用堆外内存的一种途径,当然常见的业务开发一般不会接触到,即使涉及到也可能是框架(如 Netty、RPC 等)使用的,对框架使用者来说也是透明的。 堆外内存优势 堆外内存优势在 IO 操作上,对于网络 IO,使用 Socket 发送数据时,能够节省堆内存到堆外内存的数据拷贝,所以性能更高。看过 Netty 源码的同学应该了解,Netty 使用堆外内存池来实现零拷贝技术。对于磁盘 IO 时,也可以使用内存映射,来提升性能。另外,更重要的几乎不用考虑堆内存烦人的 GC 问题。 堆外内存创建 我们直接来看代码,首先向 Bits 类申请额度,Bits 类内部维护着当前已经使用的堆外内存值,会 check 当前申请的大小与已经使用的内存大小是否超过总的堆外内存大小(默认大小与堆内存差不多,其实是有细微区别的,拿 CMS GC 来举例,它的大小是新生代的最大值 - 一个 survivor 的大小 + 老生代的最大值),可以使用 -XX:MaxDirectMemorySize 参数指定堆外内存最大大小。 如果 check 不通过,会主动执行 System.gc(),然后 sleep 100 毫秒,再进行 check,如果内存还是不足,就抛出 OOM Error。 如果 check 通过,就会调用 unsafe

函数的运行机制

Deadly 提交于 2019-11-29 06:19:50
函数的运行机制 函数 运行机制 其他细节事项 代码块 //=>创建函数 function f ( ) { var a = 10 ; a += 10 ; a /= 2 ; console . log ( a ) ; } //执行函数 f ( ) ; 函数的运行机制 ,我们了解过函数即是引用类型: 在 JavaScript 中,几乎“所有事物”都是对象。 布尔是对象(如果用 new 关键词定义) 数字是对象(如果用 new 关键词定义) 字符串是对象(如果用 new 关键词定义) 日期永远都是对象 算术永远都是对象 正则表达式永远都是对象 数组永远都是对象 函数永远都是对象 对象永远都是对象 所有 JavaScript 值,除了原始值,都是对象。 那么对象的运行机制我们已经了解: 创建全局作用域(栈内存) 代码自上而下的依次执行 创建堆内存(一次执行首先遇到的是对象),生成一个内存地址(此地址是一个虚拟地址,不占用任何的空间) 对象中 属性名:属性值 在堆内存中以键值对的形式存储 创建对象变量 var 变量名 ,将创建的堆内存的内存地址与值进行关联 操作对象 obj.属性名 : 操作的对象的键,找到与之关联的堆内存,找到操作的属性,对属性值进行修改/查询 要操作的属性名在堆内存中不存在,则视为新增键值对到堆内存中。 不同的变量关联的内存地址相同,则操作的是同一个堆内存。 注意:

JavaScript 数据结构与算法之美 - 栈内存与堆内存 、浅拷贝与深拷贝

烂漫一生 提交于 2019-11-29 01:47:07
前言 想写好前端,先练好内功。 栈内存与堆内存 、浅拷贝与深拷贝,可以说是前端程序员的内功,要知其然,知其所以然。 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习。 栈 定义 后进者先出,先进者后出,简称 后进先出 (LIFO),这就是典型的 栈 结构。 新添加的或待删除的元素都保存在栈的末尾,称作 栈顶 ,另一端就叫 栈底 。 在栈里,新元素都靠近栈顶,旧元素都接近栈底。 从栈的操作特性来看,是一种 操作受限 的线性表,只允许在一端插入和删除数据。 不包含任何元素的栈称为 空栈 。 栈也被用在编程语言的编译器和内存中保存变量、方法调用等,比如函数的调用栈。 堆 定义 堆数据结构是一种树状结构。 它的存取数据的方式,与书架与书非常相似。我们不关心书的放置顺序是怎样的,只需知道书的名字就可以取出我们想要的书了。 好比在 JSON 格式的数据中,我们存储的 key-value 是可以无序的,只要知道 key,就能取出这个 key 对应的 value。 堆与栈比较 堆是动态分配内存,内存大小不一,也不会自动释放。 栈是自动分配相对固定大小的内存空间,并由系统自动释放。 栈,线性结构,后进先出,便于管理。 堆,一个混沌,杂乱无章,方便存储和开辟内存空间。 栈内存与堆内存 JavaScript