垃圾回收

成为JavaGC专家(2)—如何监控Java垃圾回收机制

六月ゝ 毕业季﹏ 提交于 2020-04-25 08:00:38
本文是成为Java GC专家系列文章的第二篇。在第一篇《 深入浅出Java垃圾回收机制 》中我们学习了不同GC算法的执行过程,GC是如何工作的,什么是新生代和老年代,你应该了解的JDK7中的5种GC类型,以及这5种类型对于应用性能的影响。 在本文中,我将解释 JVM到底是如何执行垃圾回收处理的 。 什么是GC监控? 垃圾回收收集监控 指的是搞清楚JVM如何执行GC的过程,例如,我们可以查明: 1. 何时一个新生代中的对象被移动到老年代时,所花费的时间。 2. Stop-the-world 何时发生的,持续了多长时间。 GC监控是为了鉴别JVM是否在高效地执行GC,以及是否有必要进行额外的性能调优。基于以上信息,我们可以修改应用程序或者调整GC算法(GC优化)。 如何监控GC 有很多种方法可以监控GC,但其差别仅仅是GC操作通过何种方式展现而已。GC操作是由JVM来完成,而GC监控工具只是将JVM提供的GC信息展 现给你,因此,不论你使用何种方式监控GC都将得到相同的结果。所以你也就不必去学习所有的监控GC的方法。但是因为学习每种监控方法不会占用太多时间, 了解多一点可以帮助你根据不同的场景选择最为合适的方式。 下面所列的工具以及JVM参数并不适用于所有的HVM供应商。这是因为并没有关于GC信息的强制标准。本文我们将使用HotSpot JVM (Oracle JVM)。因为NHN

nodejs的内存管理,垃圾回收机制

╄→尐↘猪︶ㄣ 提交于 2020-03-25 15:11:40
3 月,跳不动了?>>> 要点记录: 1、网页js、命令行工具, 快进快出的,即时内存泄露,无内存管理必要! 2、服务器端nodejs和其他正规语言一样存在内存泄露。 3、nodejs基于谷歌v8js引擎,速度很快,垃圾回收也是由v8维护的 4、通过查看源码可发现v8中用js使用内存的限制约为:64位-1.4G 32位 -0.7G。这是源于v8的垃圾回收机制的限制,可在node 后加 --max-old|new-space-size=xxx来改变内存限制 5、nodejs进程的内存占用:堆内内存+堆外内存=rss+swap+fs, 其中 v8申请和分配的为堆内内存,所有js实体都是通过堆来分配的。 process.memoryUsage() 可查看常驻内存rss,heapTotal总堆 内存,和已分配的堆内存heapUsed 非V8分配的内存为堆外内存,如 Buffer对象占据的内存,用在网络流和文件流中 os.totalmem os.freemem 可查看系统的总内存和可用 内存 6、v8的垃圾回收算法 统计学知识的应用,按对象存活时间将内存的垃圾回收进行不同的分代,对这些不同的分代分别实施不同的回收算法 v8中将内存主分为新生代 和 老生代 空间,前者存活时间短,后者较长或常驻 7、新生代中活对象较少,采用scavenge-cheney算法:将新生代一分为二,From ->To

java中的内存模型

独自空忆成欢 提交于 2020-02-28 16:05:23
概述 在java中应为不同的目的可以将java划分为两种内存模型:gc内存模型。并发内存模型。 gc内存模型 java与c++之间有一堵由内存动态分配与垃圾收集技术所围成的“高墙”。墙外面的人想进去,墙里面的人想出来。 java在执行java程序的过程中会把它管理的内存划分若干个不同功能的数据管理区域。如图: 整体上。分为三部分:栈,堆,程序计数器,他们每一部分有其各自的用途;虚拟机栈保存着每一条线程的执行程序调用堆栈;堆保存着类对象、数组的具体信息;程序计数器保存着每一条线程下一次执行指令位置。这三块区域中栈和程序计数器是线程私有的。也就是说每一个线程拥有其独立的栈和程序计数器。我们可以看看具体结构: 虚拟机/本地方法栈 在栈中,会为每一个线程创建一个栈。线程越多,栈的内存使用越大。对于每一个线程栈。当一个方法在线程中执行的时候,会在线程栈中创建一个栈帧(stack frame),用于存放该方法的上下文(局部变量表、操作数栈、方法返回地址等等)。每一个方法从调用到执行完毕的过程,就是对应着一个栈帧入栈出栈的过程。 本地方法栈与虚拟机栈发挥的作用是类似的,他们之间的区别不过是虚拟机栈为虚拟机执行java(字节码)服务的,而本地方法栈是为虚拟机执行native方法服务的。 方法区/堆 在hotspot的实现中,方法区就是在堆中称为永久代的堆区域。几乎所有的对象/数组的内存空间都在堆上

HDFS 恢复某时刻删除的文件

半城伤御伤魂 提交于 2020-01-07 11:51:38
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Hadoop有一个“垃圾回收站”的功能,用于恢复在过去一段时间内被删除文件。若某个文件被删除了多次,你还可以恢复具体哪一次删除的文件。该功能默认是关闭状态,若想开启,需要在$HADOOP_HOME/etc/hadoop/core-site.xml文件中,添加以下配置: <property> <name>fs.trash.interval</name> <value>10</value> </property> 上面的配置意思为:Hadoop会设立一个回收站,回收站每隔10分钟清空一次。 若在一个回收周期内多次删除同一个文件或目录,则Trash内会分版本保存你每次删除的文件。这就意味你可以恢复在某个时刻所删除的文件。 举个例子: 时间点 动作 Trash内容 12:40 回收站清空 empty 12:41 删除fruit.data fruit.data 12:42 重新上传fruit.data且再次删除fruit.data fruit.data,fruit.data 1446352935186 12:45 重新上传fruit.data且再次删除fruit.data fruit.data,fruit.data1446352935186,fruit.data1446353100390 12:50 回收站清空

JavaScript 的垃圾回收与内存泄露

♀尐吖头ヾ 提交于 2019-12-09 17:45:29
JavaScript采用垃圾自动回收机制,运行时环境会自动清理不再使用的内存,因此javascript无需像C++等语言一样手动释放无用内存。 在这之前先说一下垃圾回收的两种方式: 引用计数 与 标记清除 。 引用计数 方式会为每个已分配内存单元设置计数器,当计数器减少到0的时候就意味着该单元无法再被引用,将会被清除。 有一个问题是,当存在循环引用时,内存单元的计数器将永远不为0,内存的释放会比较复杂(需要使用到弱引用 )。 obj.val = obj2; obj2.val = obj; 标记清除 方 式维护一条链表,当变量进入scope时被加入这条链表,移出scope时被从链表剔除。当gc被激活时,首先为每个变量打上一个标记,然后清除存在于那条链表的变量的标记以及变量引用的成员的标记。最后,不再使用到的变量仍旧被gc标记着,将被释放,包括循环引用。 如果一段不再使用的内存未得到回收,将导致 内存泄露 , 它将一直占据着内存而无法被利用,可能造成系统运行缓慢,浏览器崩溃等问题。 关于浏览器的javascript实现使用哪种回收机制,众说纷纭,感觉贵圈好乱。 我google了一下, http://www.ibm.com/developerworks/web/library/wa-memleak/?S_TACT=105AGX52&S_CMP=cn-a-wa

JAVA GC(Garbage Collection)及OOM那些事

亡梦爱人 提交于 2019-12-03 16:29:59
JAVA运行时内存区域 程序计数器 一块很小的内存空间 当前线程所执行的字节码的行号指示器 当前线程私有 不会出现OutOfMemoryError情况 java虚拟机栈 通常存放基本数据类型,对象引用(一个指向对象起始地址的引用指针或一个代表对象的句柄),reeturnAddress类型(指向一条字节码指令的地址) 线程私有,生命周期与线程相同 java方法执行的内存模型,每个方法执行的同时都会创建一个栈帧,存储局部变量表(基本类型、对象引用)、操作数栈、动态链接、方法出口等信息 StackOverflowError异常:当线程请求的栈深度大于虚拟机所允许的深度 OutOfMemoryError异常:如果栈的扩展时无法申请到足够的内存 本地方法栈 与虚拟机栈相似,主要为虚拟机使用到的Native方法服务,在HotSpot虚拟机中直接把本地方法栈与虚拟机栈二合一 和虚拟机栈一样可能抛出StackOverflowError和OutOfMemoryError异常。 Java堆(Java Heap) java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此区域的唯一目的就是存储对象实例。java堆是垃圾收集器管理的主要区域。java堆还可以细分为:新生代与老年代。再细一点有Eden空间、Form Survivor空间、To Survivor空间等。 可以通过-Xmx和

浅析:Java与C++的主要区别

可紊 提交于 2019-12-03 02:12:15
Java 区别于 C++ 表面看来两者最大的不同在于 Java 没有指针,或者说, Java 满地都是指针。对于编程者而言 Java 的这种设计是安全且更易用的。说 Java 满地是指针的原因在于它把指针的功能隐藏了,其实在程序的深处,指针仍以存储地址的形式存在着。由于程序员无法获知真实地址,实际上提供了一个更加安全的系统,避免意外破坏。 1. 引用 对于简单数据类型, Java 将和 C++ 同样采取直接存储的方式。如 int a=1; 一个名为 a 的存储地址将存储整型指 1 。 对于对象,如 Object o; 一个名为 o 的存储地址将存储的是一个 Object 类型的地址的引用而非对象本身,对象本身被存储在别处。 在 C++ 中 Object o; 这句话将创建一个对象,且留出了存储这个对象所需的空间。在 C++ 中也存在引用,但是需要显式说明,用 & 符号。 2. 赋值 O1=O2; 在 C++ 中将一个名为 O2 的对象的数据复制给 O1, 即存在两个对象,他们的值相同。 而在 Java 中,这句话只是把 O2 对象的引用复制给了 O1 ,此时它们指向同一个对象,即只存在一个对象。 4. 垃圾回收机制 在 C++ 中,对于不再需要的空间,需要用 delete 来释放,估计大家几乎都经历过忘记或者错误删除存储空间的经历吧,后果是内存泄露,系统资源被消耗,程序不稳定

成为Java GC专家(3)—如何优化Java垃圾回收机制

僤鯓⒐⒋嵵緔 提交于 2019-11-30 01:28:02
本文是成为Java GC专家系列文章的第三篇。在第一篇《 成为JavaGC专家Part I — 深入浅出Java垃圾回收机制 》中我们学习了不同GC算法的执行过程,GC是如何工作的,什么是新生代和老年代,你应该了解的JDK7中的5种GC类型,以及这5种类型对于应用性能的影响。 在第二篇《 成为JavaGC专家Part II — 如何监控Java垃圾回收机制 》, 我解释了JVM实际上是如何执行垃圾回收的,我们如何监控GC,以及那哪些具可以让我们的工作更快,更高效。在第三篇文章中,我们会基于实际的例子来解释 一些优化GC的最佳实践。我认为在阅读本篇文章之前,你已经很好地理解了之前的文章,因此,为了你能够更好地学习本文,如果你还没有读过之前的两篇文章 话,请先阅读。 为什么需要优化 GC 或者说的更确切一些, 对于基于 Java 的服务,是否有必要优化 GC ? 应该说,对于所有的基于Java的服务,并不总是需要进行GC优化,但前提是所运行的基于Java的系统,包含了如下参数或行为: 已经通过 -Xms 和–Xmx 设置了内存大小 包含了 -server 参数 系统中没有超时日志等错误日志 换句话说,如果你没有设定内存的大小,并且系统充斥着大量的超时日志时,你就需要在你的系统中进行 GC 优化了。 但是,你需要时刻铭记一条 : GC 优化永远是最后一项任务。

new一个Object对象占用多少内存?

穿精又带淫゛_ 提交于 2019-11-28 11:15:03
Java的自动内存管理机制( automatic storage management system known as a garbage collector )省却了很多编码工作,大大地提高了Java的生产力,而且JVM的性能也越来越好,特别是 G1 的出现,改善了垃圾回收中 stop the world 的状况。 也许很多人都没有考虑过这个问题, new一个Object对象到底占用多少内存呢( Object obj = new Object() )? 这里很明确的是obj是一个指向对象的引用( reference - there are three kinds of reference types: class types,array types, and interface types ),引用的长度决定了Java的寻址能力,32位的JDK是4字节,64位的JDK是8字节( 指针未被压缩的情况下 )。 因为obj对象没有任何数据(field), 会在堆上为它分配空间吗?如果分配空间,里面存储了什么内容? 以面向对象的思维来分析,对象封装了数据和行为,是一个统一的整体,虽然obj对象没有数据,但是有行为(Object类定义了12个方法)。 当我们执行完new操作后,obj的值为堆内存的地址,既然obj都指向一块内存了,说明是 会在堆上为其分配空间 的。 那么分配的空间有多大

成为Java GC专家系列

随声附和 提交于 2019-11-27 20:00:55
成为Java GC专家(1):深入浅出Java垃圾回收机制 成为Java GC专家(2):如何监控Java垃圾回收机制 成为Java GC专家(3):如何优化Java垃圾回收机制 成为Java GC专家(4):Apache的MaxClients参数及其对Tomcat执行Full GC的影响 成为Java GC专家(5):Java应用性能调优的原则 成为Java GC专家(6):JDBC连接池如何影响垃圾回收 JVM调优总结(一)-- 一些概念 JVM调优总结(二)-一些概念 JVM调优总结(三)-基本垃圾回收算法 JVM调优总结(四)-垃圾回收面临的问题 JVM调优总结(五)-分代垃圾回收详述1 JVM调优总结(六)-分代垃圾回收详述2 JVM调优总结(七)-典型配置举例1 JVM调优总结(八)-典型配置举例2 JVM调优总结(九)-新一代的垃圾回收算法 JVM调优总结(十)-调优方法 JVM调优总结(十一)-反思 JVM调优总结(十二)-参考资料 推荐阅读: 高吞吐低延迟Java应用的垃圾回收优化 JVM调优总结(1):基本垃圾回收算法 JVM调优总结(2):调优方法 Java垃圾回收精粹 深入理解JVM内幕 来源: oschina 链接: https://my.oschina.net/u/1169289/blog/698422