堆内存

Eclipse中JVM内存设置

天大地大妈咪最大 提交于 2019-12-02 08:34:21
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 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据

从内存结构上看equals,==的区别

本秂侑毒 提交于 2019-12-02 06:33:21
总之,==比较的是引用类型的址或基本数据类型的值,java中的==是用来判断对象所使用的内存地址是不是同一个,进而判断是不是同一个对象。equals()是Oblect类的一个方法,如果子类重写了,比较的是值,否者它和==相同比较的是址,就是比较两个变量是否引用的是同一对象。例如String,Integer重写了equals()方法 注意到:特殊。。。如下。。引用类型String的变量,用==比较a和b是相等的,a和d是不相等的。只有new会创建一个新的对象,为其分配内存空间。 Integer int1=128;Integer int2=128; int1==int2结果是false。 Integer int1=127;Integer int2=127; int1==int2结果是true。128以内的数进行自动封箱会激发对象池操作 java数据的存储原理(栈和堆) 如int a = 3;这里的a是一个指向int类型的引用,指向3这个字面值。出于追求速度的原因,就存在于栈中,栈有一个很重要的特殊性,就是存在栈中的数据可以共享。 比如: 我们同时定义: int a=3; int b=3; 编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int b = 3

JVM-堆内存

江枫思渺然 提交于 2019-12-02 03:17:56
1. java堆内存介绍 java的堆内存可以类比于计算机的内存,是存储整个机器数据的地方。 (1)jvm一起动就创建java堆。类比计算机一起动就加载内存。 (2)所有的线程共享。类比计算机所有进程共享一个内存。 (3)是存放实例对象的地方。 2. 堆内存图示 3. 堆内存划分 主要分为年轻代(占堆内存1/3)和老年代(占堆内存2/3)。年轻代又分为eden(占年轻代8/10),from(占年轻代1/10),to(占年轻代1/10)。下面开始分别介绍。 老年代:存储大对象和一些生命周期长的对象。 年轻代:存储占内存少并且生命周期短的对象。 那么问题来了,对象的大小比较好说,直接比较占的空间就行;生命周期长短,这玩意怎么算呢?这就是下面要介绍的eden,from,to 一个对象被new出来之后,是在eden中的。而new对象的操作很频繁,new的对象多了,eden装不下了,就需要对eden进行gc(垃圾回收),发生在eden中的这种小级别的gc叫做minor gc。 4. minor gc(young gc) 先介绍一下eden,from,to eden:对象出生的地方 from:保存幸存数据的地方 to:空的幸存区 minor gc的过程如下:(参考上图红色的标线) (1)把eden中活着的对象放到to中,并标记年龄为1。(有一部分可能会被垃圾回收掉) (2

堆与栈的区别

我的梦境 提交于 2019-12-01 22:59:53
一般情况下,有两层含义: (1)程序内存布局场景下,堆与栈表示两种内存管理方式; (2)数据结构场景下,堆与栈表示两种常用的数据结构。 程序内存分区中的堆与栈 堆与栈区别 堆与栈实际上是操作系统对进程占用的内存空间的两种管理方式,主要有如下几种区别: (1)管理方式不同。栈由操作系统自动分配释放,无需我们手动控制;堆的申请和释放工作由程序员控制,容易产生内存泄漏; (2)空间大小不同。每个进程拥有的栈的大小要远远小于堆的大小。理论上,程序员可申请的堆大小为虚拟内存的大小,进程栈的大小 64bits 的 Windows 默认 1MB,64bits 的 Linux 默认 10MB; (3)生长方向不同。堆的生长方向向上,内存地址由低到高;栈的生长方向向下,内存地址由高到低。 (4)分配方式不同。堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是由操作系统完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由操作系统进行释放,无需我们手工实现。 (5)分配效率不同。栈由操作系统自动分配,会在硬件层级对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是由C/C++提供的库函数或运算符来完成申请与管理,实现机制较为复杂,频繁的内存申请容易产生内存碎片

堆内内存与堆外内存

纵然是瞬间 提交于 2019-12-01 22:09:38
最近看Spark的 StorageLevel(存储级别) 源码的时候 看到有 useOffHeap 这个标签, 觉得有必要挖掘一下 堆内内存(on-heap memory) 堆内内存是java程序员在日常工作中解除比较多的, 可以在jvm参数中使用-Xms, -Xmx 等参数来设置堆的大小和最大值 堆内内存 = 年轻代 + 老年代 + 持久代 年轻代 (Young Generation) 存放的是新生成的对象 年轻代的目标是尽可能快速的收集掉那些生命周期短的对象 Eden 大部分对象在Eden区中生成 当Eden区满时, 依然存活的对象将被复制到Survivor区, 当一个Survivor 区满时, 此区的存活对象将被复制到另外一个Survivor区 Survivor(通常2个) 当两个 Survivor 区 都满时, 从第一个Survivor 区 被复制过来 且 依旧存活的 对象会被复制到 老年区(Tenured) Survivor 的两个区是对称的, 没有先后关系, 所有同一个区中可能同时存在从Eden复制过来的对象 和 从前一个 Survivor 复制过来的对象。 Survivor 区可以根据需要配置多个, 从而增加对象在年轻代的存在时间, 减少被放到老年代的可能。 老年代 (Old Generation) 存放了在年轻代中经历了N次垃圾回收后仍存活的对象,

线程安全好文章

霸气de小男生 提交于 2019-12-01 13:26:36
转:https://www.cnblogs.com/lixinjie/p/10817860.html 不是线程的安全 面试官问:“什么是线程安全”,如果你不能很好的回答,那就请往下看吧。 论语中有句话叫“学而优则仕”,相信很多人都觉得是“学习好了可以做官”。然而,这样理解却是错的。切记望文生义。 同理,“线程安全”也不是指线程的安全,而是指内存的安全。为什么如此说呢?这和操作系统有关。 目前主流操作系统都是多任务的,即多个进程同时运行。为了保证安全,每个进程只能访问分配给自己的内存空间,而不能访问别的进程的,这是由操作系统保障的。 在每个进程的内存空间中都会有一块特殊的公共区域,通常称为堆(内存)。进程内的所有线程都可以访问到该区域,这就是造成问题的潜在原因。 假设某个线程把数据处理到一半,觉得很累,就去休息了一会,回来准备接着处理,却发现数据已经被修改了,不是自己离开时的样子了。可能被其它线程修改了。 比如把你住的小区看作一个进程,小区里的道路/绿化等就属于公共区域。你拿1万块钱往地上一扔,就回家睡觉去了。睡醒后你打算去把它捡回来,发现钱已经不见了。可能被别人拿走了。 因为公共区域人来人往,你放的东西在没有看管措施时,一定是不安全的。内存中的情况亦然如此。 所以线程安全指的是,在堆内存中的数据由于可以被任何线程访问到,在没有限制的情况下存在被意外修改的风险。

堆和堆参数调优

二次信任 提交于 2019-12-01 08:01:35
一、再议永久代和方法区   上一篇提到:在8版本以前,JVM采用堆空间的一部分实现方法区,这部分堆空间被称为“永久代”,由于类的结构信息和运行时常量池是放在方法区的,使用永久代实现方法区容易导致堆内存溢出。在8版本推出以后,Java采用了堆外内存即本机物理内存实现方法区,我们把这部分空间称为“元空间”。       二、堆内存   众所周知,当线程new了一个对象后,对象的引用变量存放在栈针中,而对象本身存储在堆内存中,如果大量的对象存储在堆内存而无法被GC回收,那么将导致OOM错误,那么堆空间多大呢?GC的工作流程是什么样呢?可以设置堆空间大小吗?可以选择GC工作方式吗?   1、堆内存结构以及GC过程:      新生代空间:老年代空间 = 1 : 3,而其中新生代中Eden : from :to区域=8:1:1   新生代是实例对象诞生的区域,也是绝大多数实例对象消亡的区域,新生代分为两个区域:Eden区和Survivor区,Survivor区又分为SurvivorFrom区和SurvivorTo区。所有的对象都是在Eden区被new出来的。当Eden区满时会触发第一次GC,把幸存下来的对象会被 “复制”到From区 。如果Eden区再此触发GC,此时GC会扫面Eden区和From区,对这两个区域进行垃圾回收,经过这次回收后还存活的对象会直接复制到To区,并为这些对象的“年龄

Java内存释放机制

ぃ、小莉子 提交于 2019-11-30 22:43:35
转载: https://www.cnblogs.com/not-alone/articles/8206904.html ★JVM的内存?   在 Java 虚拟机规范中(具体章节请看“这里 ”),提及了如下几种类型的内存空间:   ◇栈内存(Stack):每个线程私有的。   ◇堆内存(Heap):所有线程公用的。   ◇方法区(MethodArea):有点像以前常说的“进程代码段”,这里面存放了每个加载类的反射信息、类函数的代码、编译时常量等信息。   ◇原生方法栈(Native Method Stack):主要用于JNI中的原生代码,平时很少涉及。 ?   ★垃圾回收机制简介?   其实Java虚拟机规范中并未规定垃圾回收的相关细节。垃圾回收具体该怎么搞,完全取决于各个JVM的设计者。所以,不同的JVM之间,GC的行为可能会有一定的差异。下面咱拿SUN官方的JVM来简单介绍一下GC的机制。   ◇啥时候进行垃圾回收?   一般情况下,当JVM发现堆内存比较紧张、不太够用时,它就会着手进行垃圾回收工作。但是大伙儿要认清这样一个残酷的事实:JVM进行GC的时间点是无法精确预知的。因为GC启动的时刻会受到各种运行环境因素的影响,随机性太大。   虽说咱们无法精确预知,但假如你想知道每次垃圾回收执行的情况,还是蛮方便的。可以通过JVM的命令行参数“-XX:+PrintGC

Linux进程内存统计

微笑、不失礼 提交于 2019-11-30 17:22:42
一、 进程内存统计 cat /proc/[pid]/status 通过/proc/[pid]/status可以查看进程的内存使用情况,包括虚拟内存大小(VmSize),物理内存大小(VmRSS),数据段大小(VmData),栈的大小(VmStk),代码段的大小(VmExe),共享库的代码段大小(VmLib)等等。 * Name: java /*进程的程序名*/ * State: S (sleeping) /*进程的状态信息,具体参见*/ * Tgid: 9744 /*线程组号*/ * Pid: 9744 /*进程pid*/ * PPid: 7672 /*父进程的pid*/ * TracerPid: 0 /*跟踪进程的pid*/ * VmPeak: 60184 kB /*进程地址空间的大小*/ * VmSize: 60180 kB /*进程虚拟地址空间的大小reserved_vm:进程在预留或特殊的内存间的物理页*/ * VmLck: 0 kB /*进程已经锁住的物理内存的大小.锁住的物理内存不能交换到硬盘*/ * VmHWM: 18020 kB /*文件内存映射和匿名内存映射的大小*/ * VmRSS: 18020 kB /*应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss)*/ * VmData: 12240 kB /*程序数据段的大小

转:Tomcat 内存溢出 \"OutOfMemoryError\" 问题总结 (JVM参数说明)

懵懂的女人 提交于 2019-11-30 17:11:35
问题说明: 公司内网环境中部署的jenkins代码发版平台突然不能访问了,查看tomcat的catalina.out日志发现报错如下: ? 1 2 3 4 5 6 [root@redmine logs] # tail -f /srv/apache-tomcat-7.0.67/logs/catalina.out ...... Exception in thread "http-bio-8080-exec-5" java.lang.OutOfMemoryError: PermGen space Exception in thread "http-bio-8080-exec-5" java.lang.OutOfMemoryError: PermGen space Exception in thread "http-bio-8080-exec-5" java.lang.OutOfMemoryError: PermGen space ...... 上面报错是由于tomcat内存溢出引起的: ? 1 2 3 [root@redmine logs] # ps -ef|grep tomcat root 23615 1 14 15:15 ? 00:04:45 /usr/java/jdk1 .7.0_79 /bin/java -Djava.util.logging.config. file =