随笔分类 -  JVM

虚拟机
摘要:堆(线程共享):虚拟机启动时创建,用于存放对象实例,几乎所有的对象(包含常量池)都在堆上分配内存, 当对象无法再该空间申请到内存时将抛出OutOfMemoryError异常。同时也是垃圾收集器管理的主要区域。 可通过 -Xmx –Xms 参数来分别指定最大堆和最小堆 阅读全文
posted @ 2018-10-25 17:14 鹏鹏进阶 阅读(154) 评论(0) 推荐(0)
摘要:Java方法区和永久代 目前有三大Java虚拟机:HotSpot,oracle JRockit,IBM J9。 目前有三大Java虚拟机:HotSpot,oracle JRockit,IBM J9。 JRockit是oracle发明的,用于其WebLogic服务器,IBM JVM是IBM发明的用于其 阅读全文
posted @ 2018-10-25 16:25 鹏鹏进阶 阅读(5799) 评论(1) 推荐(1)
摘要:堆:new 出的对象在堆上 java栈:java程序、线程运行数据、内存数据 每个方法都有自己的栈、运行时需要的数据存在自己的栈中 每个线程对立的是图中浅蓝色的部分(java栈、本地方法栈、程序计数器) 堆和方法区是所有线程共享的 java栈会对调用的每个方法生成一个栈帧 编写一个简单的Math.j 阅读全文
posted @ 2018-10-23 11:21 鹏鹏进阶 阅读(2606) 评论(0) 推荐(0)
摘要:查看步骤 cmd执行命令: java -XX:+PrintCommandLineFlags -version 输出如下(举例): 针对上述的-XX:UseParallelGC,这边我们引用《深入理解Java虚拟机:JVM高级特性与最佳实践》的介绍: 也就是说,打开此开关,使用的垃圾收集器是:新生代( 阅读全文
posted @ 2018-10-22 16:44 鹏鹏进阶 阅读(1670) 评论(0) 推荐(0)
摘要:因为 JVM 的 JIT 机制的存在,如果某个函数被调用多次之后,JVM 会尝试将其编译成为机器码从而提高执行速度。 阅读全文
posted @ 2018-07-25 15:40 鹏鹏进阶 阅读(380) 评论(0) 推荐(0)
摘要:Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由Java 应用开发人员编写的。 A 系统提供的类加载器主要有下面三个: 引导类加载器(bootstap class loader): 它用来加载 Java 的核心库,是用原生代码来实现的,并不继承java.lang.ClassL 阅读全文
posted @ 2018-07-19 16:21 鹏鹏进阶 阅读(501) 评论(0) 推荐(0)
摘要:JAVA 类加载器 第14节 今天我们将类加载机制5个阶段中的第一个阶段,加载,又叫做装载。为了阅读好区分,以下都叫做装载。 装载的第一步就是要获得二进制的字节流,它可以从读.class文件获得,也可以从网络中接收别人发送的字节流。反正只要符合虚拟机规定的字节流格式都可以进入这个阶段。 有了字节流了 阅读全文
posted @ 2016-08-31 23:28 鹏鹏进阶 阅读(284) 评论(0) 推荐(0)
摘要:JAVA 初识类加载机制 第13节 从这章开始,我们就进入虚拟机类加载机制的学习了。那么什么是类加载呢?当我们写完一个Java类的时候,并不是直接就可以运行的,它还要编译成.class文件,再由虚拟机解释给当前的操作系统去执行。这些过程都是我们看不见的,我们能看见的也就是一个.class文件。既然虚 阅读全文
posted @ 2016-08-31 23:03 鹏鹏进阶 阅读(334) 评论(0) 推荐(0)
摘要:JAVA 可视化分析工具 第12节 经过前几章对堆内存以及垃圾收集机制的学习,相信小伙伴们已经建立了一套比较完整的理论体系!那么这章我们就根据已有的理论知识,通过可视化工具来实践一番。 我们今天要讲工具位于JDK目录的bin目录下,大家可以发现该目录下有很多可执行文件,这里都是JDK为我们提供用于分 阅读全文
posted @ 2016-08-31 22:26 鹏鹏进阶 阅读(906) 评论(0) 推荐(0)
摘要:JAVA G1收集器 第11节 上两章我们讲了新生代和年老代的收集器,那么这一章的话我们就要讲一个收集范围涵盖整个堆的收集器——G1收集器。 先讲讲G1收集器的特点,他也是个多线程的收集器,能够充分利用多个CPU进行工作,收集方式也与CMS收集器类似,因此不会有太久的停顿。 虽然回收的范围是整个堆, 阅读全文
posted @ 2016-08-31 21:58 鹏鹏进阶 阅读(1003) 评论(0) 推荐(0)
摘要: 阅读全文
posted @ 2016-08-31 21:57 鹏鹏进阶 阅读(232) 评论(0) 推荐(0)
摘要:JAVA 年老代收集器 第10节 上一章我们讲了新生代的收集器,那么这一章我们要讲的就是关于老年代的一些收集器。老年代的存活的一般是大对象以及生命很顽强的对象,因此新生代的复制算法很明显不能适应该区域的特性,所以老年代采用的是“标记-清除-整理”算法(以前的章节有详细讨论过)。 SerilalOld 阅读全文
posted @ 2016-08-31 21:24 鹏鹏进阶 阅读(433) 评论(0) 推荐(0)
摘要:JAVA 年轻代收集器 第九节 继续上一章所讲的,STW即GC时候的停顿时间,他会暂停我们程序中的所有线程。如果STW所用的时间长而且次数多的话,那么我们整个系统稳定性以及可用性将大大降低。 因此我们在必要的时候需要对虚拟机进行调优,那么调优的主要目标之一就是降低STW的时间,也就是减少Full G 阅读全文
posted @ 2016-08-31 20:37 鹏鹏进阶 阅读(864) 评论(0) 推荐(0)
摘要:JAVA Stop The World 第八节 小伙伴还记得上一篇中我们留下的一个问题吗?什么是停顿类型!经过上几章的学习,我们知道垃圾回收首先是要经过标记的。对象被标记后就会根据不同的区域采用不同的收集方法。看上去很完美的一件事情,其实并不然。 大家有没有想过一件事情,当虚拟机完成两次标记后,便确 阅读全文
posted @ 2016-08-31 20:08 鹏鹏进阶 阅读(8025) 评论(0) 推荐(0)
摘要:java -Xms -Xmx -XX:PermSize -XX:MaxPermSize 在做java开发时尤其是大型软件开发时经常会遇到内存溢出的问题,比如说OutOfMemoryError等。这是个让开发人员很痛苦、也很纠结的问题,因为我们有时不知道什么样的操作导致了这种问题的发生。所以我们不得不 阅读全文
posted @ 2016-08-31 10:49 鹏鹏进阶 阅读(657) 评论(0) 推荐(0)
摘要:JAVA 从GC日志分析堆内存 第七节 在上一章中,我们只设置了整个堆的内存大小。但是我们知道,堆又分为了新生代,年老代。他们之间的内存怎么分配呢?新生代又分为Eden和Survivor,他们的比例大小能改变吗?其实这些都是可控的,以前没有讲到是因为就算讲了也只是讲讲而已,看不到实质性的东西。因此这 阅读全文
posted @ 2016-08-31 02:49 鹏鹏进阶 阅读(872) 评论(0) 推荐(0)
摘要:又到周末啦,祝各位小伙伴有个愉快的周末。同时也不要忘了学习,上班的同伴们可以利用这两天的时间好好提升自己,在读书的小伙伴们也可以慢慢整理这一周所学到的东西。很多情况下我们看到对自己有用的东西都会保存起来,或者做个笔记,但是很少会再次去翻阅。我们一直在前行,包囊不断获得新东西,但不知不觉得也丢下了我们 阅读全文
posted @ 2016-08-31 02:19 鹏鹏进阶 阅读(865) 评论(0) 推荐(0)
摘要:JAVA GC之标记 第五节 OK,我们继续昨天最后留下的问题,什么是标记?怎么标记? 第一个问题相信大家都知道,标记就是对一些已死的对象打上记号,方便垃圾收集器的清理。 至于怎么标记,一般有两种方法:引用计数和可达性分析。 引用计数实现起来比较简单,就是给对象添加一个引用计数器,每当有一个地方引用 阅读全文
posted @ 2016-08-30 22:37 鹏鹏进阶 阅读(984) 评论(0) 推荐(0)
摘要:JAVA 堆设置 第四节 堆已经讲得差不多啦,这章我们以一个例子来说说如何设置以及当发生堆溢出的时候怎么排查问题。先看一小段代码: 代码中使用了一个无限循环来为list添加对象,如果采用默认的堆大小的话可能要等待好久才能出现堆溢出的错误,因此我们要将其设置小一点: -Xms10m -Xmx10m - 阅读全文
posted @ 2016-08-30 20:18 鹏鹏进阶 阅读(1788) 评论(0) 推荐(0)
摘要:1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描。而我们的很多对象都是朝生夕死的,如果分代的话, 阅读全文
posted @ 2016-08-30 19:49 鹏鹏进阶 阅读(1406) 评论(0) 推荐(1)