java虚拟机小贴士之GC分析】的更多相关文章

打印日志 通过加入 -XX:+PrintGCDetails 参数则可以打印详细GC信息至控制台.参数-verbose:gc也是可以,但不够详细.通过加入-XX:+PrintGCDateStamps则可以记录GC发生的详细时间.通过加入 -Xloggc:/home/XX/gc/app_gc.log.可以把GC输出至文件,这对长时间服务器GC监控很有帮助.通过加入-XX:+DisableExplicitGC可以将System.gc()转为空操作. 日志分析 ParNew 通过加入-XX:+UsePa…
在上篇博客中,我们学习了Parallel.CMS.G1三种垃圾收集器的日志格式,本次我们通过工具去分析日志,会更加的直观 日志格式博客地址:java虚拟机(十一)--GC日志分析 GCeasy: 这是一个在线分析日志的工具,主要功能是免费的,存在部分收费,地址:https://gceasy.io/ 把上篇博客生成的日志文件,上传分析,就会接到可视化界面 文件名:Parallel.gc.log,持续时间:6s,可以下载,分享 jvm堆: Allocated:各部分分配大小 Peak:峰值内存使用量…
目录 1.Java虚拟机内存模型 1.1 程序计数器 1.2 Java虚拟机栈 局部变量 1.3 本地方法栈 1.4 Java堆 1.5 方法区(永久区.元空间) 附图 2.JVM内存分配参数 2.1 设置最大堆内存 2.2 设置最小堆内存 2.3 设置新生代 2.4 设置持久代 2.5 设置线程栈 2.6 堆的内存分配 2.7 堆分配参数总结 3.垃圾收集基础 3.1 垃圾收集的作用 3.2 垃圾回收算法与思想 3.2.1 引用计数法(Reference Counting) 3.2.2 标记-…
上节学习回顾 在上一节当中,主要学习了Sun JDK的一些命令行和可视化性能监控工具的具体使用,但性能分析的重点还是在解决问题的思路上面,没有好的思路,再好的工具也无补于事. 本节学习重点 在书本上本节的主要内容是讲作者在工作过程中对调优的一些经验实战.对于我们读者来说,重点是学习作者分析解决问题的具体思路.当然不能离开书本的内容,作者利用的是上一节所介绍到的工具去解决他所遇到的问题.但本人的工作环境跟书本上的教程不一致,但思路大同小异.所以在本章的学习笔记当中,还是结合自身的情况,聊聊调优这事…
根据Java虚拟机规范,虚拟机内存中除过程序计数器之外的运行时数据区域都会发生OutOfMemoryError(OOM),本文将通过实际例子验证分析各个数据区域OOM的情况.为了更贴近生产,本次所有例子都是通过调用接口触发,并使用jvisualvm工具监控tomcat内存进行分析. 一.Java堆溢出 Java堆主要用于存储对象和数组实例,只要不断创建对象或者数组,并且保证CG Roots(垃圾收集器对象)到对象之间有可达路径来避免垃圾回收机制清除这些对象,在对象数量到达最大堆的限制后就会产生内…
前言 前面我们已经知道了Java虚拟机所做的事情就是回收那些不用的垃圾,那些不用的对象.那么问题来了,我们如何知道一个对象我们不需要使用了呢?程序在使用的过程中会不断的创建对象,这些所创建的对象指不定在哪里我们就需要用到了呢?GC怎么知道我们不用了呢?回收就是简单的删除吗?这些问题将会在这里做出解释. 怎么判断一个对象将会被回收 说白了就是判断一个对象已经死亡,不会再被用到了. 首先我们需要知道java中有四种不一样的引用. 强引用:A a = new A() 软引用:还有用,但不是必须的对象,…
出处:https://blog.csdn.net/u013256816/article/details/50829596 https://blog.csdn.net/u013256816/article/details/50837863 看到这个题目,很多人会觉得我写我的java代码,至于类,JVM爱怎么加载就怎么加载,博主有很长一段时间也是这么认为的.随着编程经验的日积月累,越来越感觉到了解虚拟机相关要领的重要性.闲话不多说,老规矩,先来一段代码吊吊胃口. public class SSCla…
大内存硬件上的程序部署策略 单个虚拟机管理大内存 出现问题 如果JVM中的堆内存太小,就会频繁地出发GC,而每次GC会将用户线程暂停,所以,频繁地GC会导致长时间的停顿.如果扩大计算的内存的大小,就能降低GC触发的频率. 32位系统最大支持4g内存,而64位操作系统可以最大支持128g内存,所以,我们可以通过换用64位系统和提高内存的方式降低虚拟机的用户线程停顿,但是还是有问题. 虽然Full GC总体的频率降低了,但是每次Full GC的时间却增长了,因为积攒的需要回收的空间变大了嘛.这样会导…
GC回收算法 1.标记清除算法分为标记阶段和清除阶段标记阶段:通过特定的判断方式找出无用的对象实例并将其标记清除阶段:将已标记的对象所占用的内存回收缺点:运行多次以后容易产生空间碎片,当需要一整段连续内存时虽然空间足够但是无法分配,会多次触发GC操作. 2.复制算法为了提高标记清除算法的效率,减少内存碎片的产生而出现的,该算法将内存空间分为两个完全相同的两部分,每次只使用其中的一部分.分为标记阶段.复制阶段和清除阶段标记阶段:同标记清除算法的标记阶段一致复制阶段:将为标记的对象全部复制到另一块未…
一.内存溢出程序 public class Test { public static void main(String[] args) { List<User> userList=new ArrayList<User>(); while(true) { userList.add(new User()); } } } public class User implements Serializable { /** * */ private static final long seria…
GC调优对我们开发人员来说,如果你想要技术方面一直发展下去,这部分内容的了解是必不可少的,jvm对于工作.面试来说都很重要,GC调优的问题 更是重中之重,因为是对你jvm学习内容的实践,知识只有应用实践出来才有意义,否则知识纸上谈兵. 首先,我们需要了解的内容,包括: 1.jvm内存结构:java虚拟(一)--java内存区域和常量池概念 2.垃圾收集算法:java虚拟机(五)--垃圾回收机制GC 3.常见的垃圾收集器:java虚拟机(六)--垃圾收集器和内存分配策略 4.GC日志分析:java…
今天开始实战Java虚拟机之三:“G1的新生代GC”. 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四“禁用System.gc()” 实战Java虚拟机之五“开启JIT编译” 新生代GC的主要工作是回收eden区和survivor区.一旦eden区被占满,新生代GC就会启动.新生代GC收集前后的堆数据如图5.6所示,其中E表示eden区,S表示survivor区,O表示老年代.可…
今天开始实战Java虚拟机之四:"禁用System.gc()". 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四“禁用System.gc()” 实战Java虚拟机之五“开启JIT编译” 默认情况下,System.gc()会显式直接触发Full GC,同时对老年代和新生代进行回收.而一般情况下我们认为,垃圾回收应该是自动进行的,无需手工触发.如果过于频繁地触发垃圾回收对系…
从今天开始,我会发5个关于java虚拟机的小系列: 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四“禁用System.gc()” 实战Java虚拟机之五“开启JIT编译” 下面说说[实战Java虚拟机之一“堆溢出处理”] 在Java程序的运行过程中,如果堆空间不足,则有可能抛出内存溢出错误(Out Of Memory),简称为OOM.如下文字显示了典型的堆内存溢出: Exception in t…
JVM(Java Virtual Machine),Java虚机机,是JDK最底层的东西.只要能将源代码编译成字节码(.class)文件,就可以由JVM在不同平台上解释成机器指令来执行.所以,Java语言的平台无关性,实际上是因为有不同平台下的JVM的支持. 自动内存管理机制 Java程序的内存分配由JVM管理,所管理的内存划分为5个不同的数据区域.自动内存管理可归结为解决两个问题:给对象分配内存以及回收分配给对象内存. 程序计数器 用途:当前线程所执行的字节码的行号指示器. 生命周期:与线程相…
从今天開始.我会发5个关于java虚拟机的小系列: 实战Java虚拟机之中的一个"堆溢出处理" 实战Java虚拟机之二"虚拟机的工作模式" 实战Java虚拟机之三"G1的新生代GC" 实战Java虚拟机之四"禁用System.gc()" 实战Java虚拟机之五"开启JIT编译" 以下说说[实战Java虚拟机之中的一个"堆溢出处理"] 在Java程序的执行过程中,假设堆空间不足.则有可能抛…
正文 垃圾收集器关注的是 Java 堆和方法区,因为这部分内存的分配和回收是动态的.只有在程序处于运行期间时才能知道会创建哪些对象,也才能知道需要多少内存. 虚拟机栈和本地方法栈则不需要过多考虑回收的问题,因为栈中每一个栈帧分配多少内存基本上是在类结构确定下来时就已知的,因此这几个区域的内存分配和回收具有确定性. 一.对象已死吗 垃圾收集器在对堆进行回收前,第一件事就是要确定堆中对象哪些还"存活"着,哪些已"死去"(即不可能再被任何途径使用的对象). 1. 引用计数…
今天开始实战Java虚拟机之二:“虚拟机的工作模式”. 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四“禁用System.gc()” 实战Java虚拟机之五“开启JIT编译” 目前的Java虚拟机支持Client和Server两种运行模式.使用参数-client可以指定使用Client模式,使用参数-server可以指定使用Server模式.默认情况下,虚拟机会根据当前计算机系统…
说起GC,我们要思考的主要有三件事 哪些内存需要回收 那些已经“死去”的对象,那么哪些对象“死”,哪些对象“活”呢,有个简单的办法 引用计数法,但是没法解决循环依赖问题 所以Java虚拟机采用的是可达性分析算法 这个算法通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,如果对象无法被搜到,那么这些对象会被标记为要清除的对象. 那么“GC Roots”又是什么?“GC Roots”主要有以下几种 活跃栈帧中的指向GC堆的引用,就是方法运行时的临时变量,引用参数 被加载的J…
今天开始实战Java虚拟机之五“开启JIT编译” 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四“禁用System.gc()” 实战Java虚拟机之五“开启JIT编译” Java虚拟机有3种执行方式,分别是解释执行.混合模式和编译执行,默认情况下处于混合模式中.使用命令行java –version可以查看虚拟机的执行模式: C:\Users\Administrator>java…
啥也不说了,实战java虚拟机,好好学习,天天向上!针对自己的软肋制定学习计划. 一部分内容看完,自己做的学习笔记和感想. 学java很简单,但懂java会有难度,如果你的工资还没超过1W,那是时候深入学习一下子了.    边学习边奉上5篇笔记 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四“禁用System.gc()” 实战Java虚拟机之五“开启JIT编译”  <实战Java虚拟机>一书的…
java虚拟机体系结构 方法区 堆 java虚拟机栈 本地方法栈 方法区 java虚拟机编译的class文件中二进制数据类型解析数据存在方法区中 是所有线程共享 和存在数据的线程安全问题 当二个线程使用同一类并且类还被加载 则让一个线程加载 另一个 线程等待 java虚拟机栈 是线程私有的 既决定了线程的个数 存放的变量 对象引用 堆 是所有线程所共享 存放的是所有的对象 涉及到多线程的并发 对象的引用 直接引用 使用句柄引用 直接内存不是java虚拟机的一部分 加快GC的垃圾回收 但直接内存出…
堆内存使用分析,GC 日志解读 重要的东东 在Java中,对象实例都是在堆上创建.一些类信息,常量,静态变量等存储在方法区.堆和方法区都是线程共享的. GC机制是由JVM提供,用来清理需要清除的对象,回收堆内存. GC机制将Java程序员从内存管理中解放了出来,可以更关注于业务逻辑. 在Java中,GC是由一个被称为垃圾回收器的守护线程执行的. 在从内存回收一个对象之前会调用对象的finalize()方法. 作为一个Java开发者不能强制JVM执行GC:GC的触发由JVM依据堆内存的大小来决定.…
Java 垃圾回收(Garbage Collection,GC) Java支持内存动态分配.垃圾自动回收,而 C++ 不支持.我想这可能也是 为什么 Java 脱胎于 C++ 的一个原因吧. GC 的历史 GC 的历史比 Java 更久远,比如 1960 年诞生的于 MIT 的 Lisp 就是第一门真正使用内存动态分配和垃圾回收的语言. GC 需要考虑的 3 件事情 哪些内存需要回收? 什么时候回收? 如何回收? 我们从这三个问题出发,来更深一层地看看 JVM GC 为我们做了哪些工作. 1.哪…
身为一个java程序员如果只会使用而不知原理称其为初级java程序员,知晓原理而升中级.融会贯通则为高级 作为有一个有技术追求的人,应当利用业余时间及零碎时间了解原理 近期在看深入理解java虚拟机 第二版(基于jdk1.7)所以想写一些观后心得,整理一些比较重点的内容,也加强自己对重点内容的记忆! 以下默认虚拟机为hotsport虚拟机 一.jvm内存模型 ① 程序计数器: 程序计数器为每个线程私有 作用可以理解为在虚拟机解析字节码时记录当前字节码的行号 占用的内存较小 是唯一一个不会发生内存…
GC相关:java虚拟机(六)--垃圾收集器和内存分配策略 java虚拟机(五)--垃圾回收机制GC 打印日志相关参数: -XX:+PrintGCDetails -XX:PrintGCTimestamps -XX:PrintGCDateStamps -Xloggc:$CATALINA_HOME/logs/gc.log -XX:+PrintHeapAtGC -XX:+PrintTenuringDistriution:发生GC的时候,把Young区中对象的年龄打印出来 其余的参数应该能直接看懂的,就…
哪些内存需要回收? 哪些内存需要回收是垃圾回收机制第一个要考虑的问题,所谓“要回收的垃圾”无非就是那些不可能再被任何途径使用的对象.那么如何找到这些对象? 1.引用计数法 这个算法的实现是,给对象中添加一个引用计数器,每当一个地方引用这个对象时,计数器值+1:当引用失效时,计数器值-1.任何时刻计数值为0的对象就是不可能再被使用的.这种算法使用场景很多,但是,Java中却没有使用这种算法,因为这种算法很难解决对象之间相互引用的情况.看一段代码: /** * 虚拟机参数:-verbose:gc *…
Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢.这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制.概括地说,该机制对JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定…
⑴背景 Java堆和方法区实现类所需内存是不一样的,每个方法的多分支需要的内存也可能不一样,我们只有在运行期间才能制动创建哪些对象.这部分内存分配与回收都是动态的,而垃圾回收器所关注的就是这些这部分内存. ⑵基本垃圾回收算法 ①引用计数法:给每个对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,当引用失效时,计数器就减1,任何时刻计数器为0的对象是不可能被使用的. 引用计数法简单易实现,但判定效率也很高,在大部分情况下式不错的算法.但主流Java虚拟机都没有使用引用计数器来管理内存…
案例分析 高性能硬件上的程序部署策略 例 如 ,一个15万PV/天左右的在线文档类型网站最近更换了硬件系统,新的硬件为4个CPU.16GB物理内存,操作系统为64位CentOS 5.4 , Resin作为Web服务器.整个服务器暂时没有部署别的应用,所有硬件资源都可以提供给这访问量并不算太大的网站使用.管理员为 了尽量利用硬件资源选用了64位的JDK 1 . 5 ,并通过-Xmx和-Xms参数将Java堆固定在12GB.使用一段时间后发现使用效果并不理想,网站经常不定期出现长时间失去响应的情况.…