堆内存

全面认识Eclipse中JVM内存设置

一笑奈何 提交于 2019-12-16 20:48:04
这里向大家描述一下Eclipse中如何进行 JVM 内存设置,JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。 Eclipse中JVM内存设置 eclipse.ini内存设置 -vmargs-Xms128M-Xmx512M-XX:PermSize=64M-XX:MaxPermSize=128M 这里有几个问题: 1.各个参数的含义什么? 2.为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动? 3.为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置? 下面我们一一进行回答 1.各个参数的含义什么? 参数中-vmargs的意思是设置JVM参数,所以后面的其实都是JVM的参数了,我们首先了解一下JVM内存管理的机制,然后再解释每个参数代表的含义。 堆(Heap)和非堆(Non-heap)内存 按照官方的说法:“Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在Java虚拟机启动时创建的。”

使用 zabbix 监控 tomcat(包含jvm监控)

依然范特西╮ 提交于 2019-12-15 19:32:09
1.前言: 我们的监控系统是zabbix,最近刚做完jvm还有tomcat的监控,需要吐槽以下内容: zabbix官方提供的jvm和tomcat监控模版,存在item书写格式的坑,导致很多内容无法获取到监控。 网友写的zabbix监控java文章,99%就只有环境的搭建,没有zabbix item键值,所以环境监控上了,item键值不知道怎么写。 本文监控jvm内容如下: **内存使用状态:**堆内存(Heap memory)和非堆内存(No Heap memory),包括已用值、最大值、已提交; **堆内存内存池:**新生代(eden space),survivor space,老年代(old gen)的内存使用状态; **非堆内存内存池:**代码缓存(Code cache),元空间(meta space),压缩类空间(compressed class space); **类加载:**加载总数,已加载,已卸载。 **Java线程:**总开启线程,活动线程,线程峰值。 本文监控tomcat内容如下: Tomcat请求数:包括每秒请求数,每秒出错数; Tomcat网络流量统计:包括进流量统计,出流量统计; Tomcat线程:包括最大线程数,当前线程数,当前繁忙线程数。 我没有在zabbix中添加垃圾回收(gc)的监控,而是在catalina配置里面添加gc日输入来给开发进行分析

使用jmap和MAT分析JVM堆内存

雨燕双飞 提交于 2019-12-15 03:07:20
我的一台生产环境机器每次运行几天之后就会莫名其妙的宕机,分析日志之后发现在tomcat刚启动的时候内存占用比较少,但是运行个几天之后内存占用越来越大,通过jmap命令可以查询到一些大对象引用没有被及时GC,这里就要求解决内存泄露的问题。 Java的内存泄露多半是因为对象存在无效的引用,对象得不到释放,如果发现Java应用程序占用的内存出现了泄露的迹象,那么我们一般采用下面的步骤分析: 1. 用工具生成java应用程序的heap dump(如jmap) 2. 使用Java heap分析工具(如MAT),找出内存占用超出预期的嫌疑对象 3. 根据情况,分析嫌疑对象和其他对象的引用关系。 4. 分析程序的源代码,找出嫌疑对象数量过多的原因。 以下一步步的按照项目实例来操作,去解决内存泄露的问题。 1. 登录linux服务器,获取tomcat的pid,命令: ps -ef|grep java 2. 利用jmap初步分析内存映射,命令: jmap -histo:live 3514 | head -7 第2行是我们业务系统的对象,通过这个对象的引用可以初步分析出到底是哪里出现了引用未被垃圾回收收集,通知开发人员优化相关代码。 3. 如果上面一步还无法定位到关键信息,那么需要拿到heap dump,生成离线文件,做进一步分析,命令: jmap -dump:live,format=b,file

大数据计算引擎之 Flink原理与实现:内存管理

不羁岁月 提交于 2019-12-12 15:15:19
转载自: Flink原理与实现:内存管理 本文地址: 大数据计算引擎之 Flink原理与实现:内存管理 如今,大数据领域的开源框架(Hadoop,Spark,Storm)都使用的 JVM,当然也包括 Flink。基于 JVM 的数据分析引擎都需要面对将大量数据存到内存中,这就不得不面对 JVM 存在的几个问题: Java 对象存储密度低。一个只包含 boolean 属性的对象占用了16个字节内存:对象头占了8个,boolean 属性占了1个,对齐填充占了7个。而实际上只需要一个bit(1/8字节)就够了。 Full GC 会极大地影响性能,尤其是为了处理更大数据而开了很大内存空间的JVM来说,GC 会达到秒级甚至分钟级。 OOM 问题影响稳定性。OutOfMemoryError是分布式计算框架经常会遇到的问题,当JVM中所有对象大小超过分配给JVM的内存大小时,就会发生OutOfMemoryError错误,导致JVM崩溃,分布式框架的健壮性和性能都会受到影响。 所以目前,越来越多的大数据项目开始自己管理JVM内存了,像 Spark、Flink、HBase,为的就是获得像 C 一样的性能以及避免 OOM 的发生。本文将会讨论 Flink 是如何解决上面的问题的,主要内容包括内存管理、定制的序列化工具、缓存友好的数据结构和算法、堆外内存、JIT编译优化等。 积极的内存管理 Flink

JS 中的内存机制

爷,独闯天下 提交于 2019-12-09 19:18:12
JS 中的内存机制 JS 中的数据存储分为 栈内存 和 堆内存 基本的数据类型存放在 栈内存 中 六种基本数据类型 string int boolean undefined null symbol 复杂的数据类型存放在 堆内存 中 复杂数据类型 object 基本的图解 来源: CSDN 作者: 小火车况且况且况且 链接: https://blog.csdn.net/weixin_43972992/article/details/103448026

堆和栈

烂漫一生 提交于 2019-12-09 17:50:58
栈(stack) 是由编译器自动分配和释放的一块内存区域,主要用于存放一些基本类型(如int、float等)的变量、指令代码、常量及对象句柄(也就是对象的引用地址)。栈内存的操作方式类似于数据结构中的栈(仅在表尾进行插入或删除操作的线性表)。        栈的优势 在于,它的存取速度比较快,仅此于寄存器,栈中的数据还可以共享。       其 缺点 表现在,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。 堆(heap) 是一个程序运行动态分配的内存区域,在Java中,构建对象时所需要的内存从堆中分配。这些对象通过new指令“显式”建立,这种分配方式类似于数据结构中的链表。堆内存在使用完毕后,是由垃圾回收(Garbage Collection,GC)器“隐式”回收的。       堆的优势 是在于动态地分配内存大小,可以“按需分配”,其生存期也不必事先告诉编译器,在使用完毕后,Java的垃圾收集器会自动收走这些不再使用的内存块。       其 缺点 为,由于要在运动时才动态分配内存,相比于栈内存,它的存取速度较慢。 栈(stack) 堆(heap) 它的存取速度比较快 由于要在运动时才动态分配内存,相比于栈内存,它的存取速度较慢。 存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。 动态地分配内存大小,可以“按需分配”,其生存期也不必事先告诉编译器 原文: https:/

c/c++里的 堆区 栈区 静态区 文字常量区 程序代码区

随声附和 提交于 2019-12-06 14:58:57
一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由 编译器 自动分配释放 ,存放 函数 的参数值, 局部变量 的值等 。其操作方式类似于数据结构中的栈。 堆(heap):由malloc,new等分配的空间的地址,地址由低向高增长(程序员释放)。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于 链表 。 栈(stack):是自动分配变量,以及函数调用所使用的一些空间(所谓的局部变量),地址由高向低减少; 3、全局区(静态区)(static)— 全局变量和 静态变量 的存储是放在一块的, 初始化的 全局变量 和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放 。-->分别是data区,bbs区 4、文字常量区 — 常量字符串就是放在这里的,程序结束后由系统释放 。-->coment区 5、程序代码区 — 存放函数体的二进制代码。-->code区 二、例子程序 这是一个前辈写的,非常详细 //main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc"; 栈 char *p2; 栈 char *p3 =

JVM-4-堆内存划分

孤者浪人 提交于 2019-12-06 06:38:03
什么是堆内存划分 Java虚拟机根据对象存活的周期不同,把堆内存划分为几块, 一般分为新生代、老年代和永久代,这就是JVM的内存分代策略。(JDK 1.8之后将最初的永久代取消了,由元空间取代) 为什么要分代? 堆内存是虚拟机管理的内存中最大的一块,也是垃圾回收最频繁的一块区域,我们程序所有的对象实例都存放在堆内存中。给堆内存分代是为了提高对象内存分配和垃圾回收的效率。试想一下,如果堆内存没有区域划分,所有的新创建的对象和生命周期很长的对象放在一起,随着程序的执行,堆内存需要频繁进行垃圾收集,而每次回收都要遍历所有的对象,遍历这些对象所花费的时间代价是巨大的,会严重影响我们的GC效率,这简直太可怕了。 有了内存分代,情况就不同了,新创建的对象会在新生代中分配内存,经过多次回收仍然存活下来的对象存放在老年代中,静态属性、类信息等存放在永久代中,新生代中的对象存活时间短,只需要在新生代区域中频繁进行GC,老年代中对象生命周期长,内存回收的频率相对较低,不需要频繁进行回收,永久代中回收效果太差,一般不进行垃圾回收,还可以根据不同年代的特点采用合适的垃圾收集算法。分代收集大大提升了收集效率,这些都是内存分代带来的好处 如何进行内存分代划分 Java虚拟机将堆内存划分为新生代、老年代和永久代,永久代是HotSpot虚拟机特有的概念 在JDK 1.7中HotSpot已经开始了“去永久化”

内存分配及变量存储位置(堆、栈、方法区常量池、方法区静态区)

非 Y 不嫁゛ 提交于 2019-12-06 05:10:48
区别: “==” 比较的是两个引用在内存中指向的是不是同一对象(即同一内存空间),也就是说在内存空间中的存储位置是否一致。(引用类型) 如果两个对象的引用相同时(指向同一对象时),“==”操作符返回true,否则返回flase。 注:如果有对 内存分配及变量存储位置(堆、栈、方法区常量池、方法区静态区) 感兴趣的可以去看看这篇博客,里面写的很详细。对我还在学基础的人来说帮助很大,理解了很多内容,还有待消化。 equals方法是由Object类提供的,可以由子类来进行重写 Object类默认的实现如下: 1 public boolean equals(Object obj) { 2 3 return (this == obj); 4 5 } 默认的实现只有当对象和自身进行比较时才会返回true, 这个时候和 “==”是等价的。 Java中很多类(String类 Date类 File类)等都对equals方法进行了重写,这里拿常见的String类举例。 1 public class Test { 2 public static void main(String[] args) { 3 String str1 = "abc"; 4 String str2 = "abc"; 5 System.out.println(str1==str2);//true 6 7 8 String str3

Java的内存划分

那年仲夏 提交于 2019-12-06 02:52:18
1,栈(Stack): 存放的都是方法中的局部变量,方法的运行一定要在栈当中。   局部变量:方法的参数或者方法内部的变量   作用域:一旦超出作用域,立刻从栈内存当中消失 2,堆(Heap):凡是 new 出来的东西,都在堆当中。   堆内存里面的东西都有一个地址值:16进制   堆内存里面的数据,都有默认值:     如果是整数:默认为0     如果是浮点数:默认为0.0     如果是字符:默认为'\u0000'     如果是布尔:默认为false     如果是引用类型:默认为null 3,方法区(Method Area):存储 .class 相关信息,包含方法的信息。 4,本地方法栈(Native Method Stack):与操作系统相关。 5,寄存器(pc Register):与CPU相关。 来源: https://www.cnblogs.com/3b2414/p/11959146.html