JVM
文章平均质量分 71
wwwtotoro
找一个无人的地方,自说自话
展开
-
JVM进阶(十七)——准备-解析-初始化
JVM进阶(十七)——准备-解析-初始化 在类加载机制的五个阶段中,我们已经讲完了第一个阶段。剩下的四个阶段由于涉及到比较多的类文件相关的知识,现在讲了会看得很吃力,所以我们暂时不会一一的去细讲,只说一下大概的用处,让大家有个概念性的认识。 装载之后的阶段就是校验阶段了,该阶段的目的就是确保上一阶段读进来的二进制字节流中包含的信息符合虚拟机的规范,并且不会危害虚拟机自身。校验主要分转载 2017-05-26 08:48:46 · 262 阅读 · 0 评论 -
JVM进阶(二)——初识JAVA堆
JVM进阶(二)——初识JAVA堆 在博文《JVM进阶(一)——初识JAVA栈》中我们说到了栈,他在内存中是连续的空间;保存一个个的栈帧,对应一次次方法的调用;还讲到了他是保存对象的引用,那么对象存在哪里呢?我们来看看昨天的一张图: 对象就存在图中的内存区域,在JVM中,那片区域叫做堆! 由图中可以看到堆的存储结构和栈是不同的,堆在内存中并不是一块连续的区域,他是分转载 2017-05-26 08:38:25 · 292 阅读 · 0 评论 -
JVM进阶(六)——鲜为人知的二次标记
JVM进阶(六)——鲜为人知的二次标记 上一章我们讲到了标记,但是不是被标记了就肯定会被回收呢?不知道小伙伴们记不记得Object类有一个finalize()方法,所有类都继承了Object类,因此也默认实现了这个方法。 这个方法的用途就是:在该对象被回收之前,该对象的finalize()方法会被调用。这里的回收之前指的就是被标记之后,问题就出在这里,有没有一种情况就是原本一个对象转载 2017-05-26 08:41:39 · 371 阅读 · 0 评论 -
JVM进阶(十八)——初识Class文件
JVM进阶(十八)——初识Class文件 关于类加载机制的相关知识在前面的博文中暂时先讲那么多。中间留下了很多问题,从本篇博文开始,我们来一一解决。 从我们最陌生而又最熟悉的.class文件开始说起。.class文件是一个由8位二进制构成一个字节的字节码文件,里面的格式都是按照规定好的顺序紧凑的排列在文件中。 在.class文件中,他的数据都是以无符号数和表的形式存储的,后转载 2017-05-26 08:49:19 · 193 阅读 · 0 评论 -
JAVA JVM
对于JVM的,主要是两大方面内容:JVM的内存管理和垃圾回收机制。Java类的编译、加载和执行。一、JVM的内存管理和垃圾回收机制。参考:http://blog.csdn.net/seu_calvin/article/details/518925671、java虚拟机内存区域与内存溢出异常(1)运行时数据区域(2)对象访问定位: 通过句柄、直接指针(3)各数据区域的溢出:栈溢出、内存溢出blog....原创 2017-10-18 21:19:39 · 197 阅读 · 0 评论 -
JAVA环境变量含义
Java安装配置过程中1、在环境变量中,要修改两个地方,一个是添加JAVA_HOME。可以选择“新建”,变量名填上JAVA_HOME,变量值填上C:\Program Files\Java\jdk1.7.0_04,因为在上面的安装过程中,我默认一直下一步安装,所以装在C盘,如果你在安装过程中改了,那可能是D盘或 者E盘。同样变量值要做相应的更改。2、还要修改一个地方,就是Path,添加JAV原创 2017-07-15 23:15:32 · 837 阅读 · 0 评论 -
JAVA ClassLoader加载类
相信每个Java程序员都知道Classpath是什么,Java 的类加载器(Classloader)是一种分层结构,如下图所示,分为引导类加载器(Bootstrap Class Loader),扩展类加载器(Extension Class Loader),系统类加载器(System Class Loader)以及用户定义的类加载器(User-defined Class Loader)。引导类加载器原创 2017-07-15 23:13:45 · 350 阅读 · 0 评论 -
OSGI学习之路之Require-Bundle与Imported-Package
1 OSGI之Require-Bundle与Imported-PackageOSGI中的bundle在依赖其他的bundle的时候,有两种方式:Require-Bundle与Imported-Package。这里简单的讲讲他们之间的区别。先看看基础的定义:• Required-Bundle: Specify thelist of plug-ins require原创 2017-07-15 23:07:40 · 2102 阅读 · 0 评论 -
OSGI学习笔记之OSGI框架
1.1 OSGi框架OSGi框架规范中定义了框架的正确行为;而核心框架可有多种实现方式。OSGi框架是根据OSGi规范中定义的三个概念层设计的: 1.1.1 1)模块层模块层关注于打包、共享代码。模块层定义了OSGi模块的概念(bundle,即包含一个元数据MANIFEST.MF的JAR文件)。bundle比标准JAR文件更强大,它可以声明哪些包对外原创 2017-07-15 23:04:38 · 507 阅读 · 0 评论 -
JVM进阶(十五)——JAVA 类加载器
JVM进阶(十五)——JAVA 类加载器 今天我们将类加载机制5个阶段中的第一个阶段,加载,又叫做装载。为了便于阅读,以下都叫做装载。 装载的第一步就是要获得二进制的字节流,它可以从读.class文件获得,也可以从网络中接收别人发送的字节流。反正只要符合虚拟机规定的字节流格式都可以进入这个阶段。 有了字节流之后,要进行装载还需要一个工具,那就是加载器了。加载器既可以使用系统转载 2017-05-26 08:47:14 · 262 阅读 · 0 评论 -
JVM进阶(三)——内存分配与回收策略
JVM进阶(三)——内存分配与回收策略 各位小伙伴大家好,还记得上一博文《JVM进阶(二)——初识JAVA堆》我们讲了什么吗?虚拟机中的堆,他是整个内存模型中占用最大的一部分,而且不是连续的。当有需要分配内存的时候,一般有两个方法分配,指针碰撞和空闲列表。该部分的内存回收是由虚拟机的垃圾收集器GC进行管理的。 刚刚粗略的回忆了上一博文所讲的内容,而这一章我们的重点还在堆上面。之前有转载 2017-05-26 08:38:58 · 285 阅读 · 0 评论 -
JVM进阶(四)——利用MAT排查堆溢出
JVM进阶(四)——利用MAT排查堆溢出 堆已经讲得差不多啦,这章我们以一个例子来说说如何设置以及当发生堆溢出的时候怎么排查问题。先看一小段代码: 代码中使用了一个无限循环来为list添加对象,如果采用默认的堆大小的话可能要等待好久才能出现堆溢出的错误,因此我们要将其设置小一点: -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryEr转载 2017-05-26 08:39:59 · 471 阅读 · 0 评论 -
JVM进阶(十六)——JAVA 双亲委派模型
JVM进阶(十六)——JAVA 双亲委派模型 在上一篇博文中,我们知道了如何获得二进制的字节流,并根据获得的字节流去装载一个类。同时也了解到类加载器的存在,每个加载器对应着不同的加载目录,相互配合着,从而使整个加载过程稳定而安全。 那么他们是如何配合的呢?如果我自己写一个类,名字叫做String可以吗? 首先我们来看一张图: 图中除了最底下的那个加载器是我们转载 2017-05-26 08:48:02 · 477 阅读 · 0 评论 -
JVM进阶(十四)——初识JAVA 类加载机制
JVM进阶(十四)——初识JAVA 类加载机制 从本篇博文开始,我们就进入虚拟机类加载机制的学习了。那么什么是类加载呢?当我们写完一个Java类的时候,并不是直接就可以运行的,它还要编译成.class(字节码)文件,再由虚拟机解释给当前的操作系统去执行。这些过程都是我们看不见的,我们能看见的也就是一个.class文件。既然虚拟机要解释这些.class文件给当前的操作系统听,那么他怎么获得这些转载 2017-05-26 08:46:40 · 343 阅读 · 0 评论 -
JVM进阶(十三)——阶段回顾
JVM进阶(十三)——阶段回顾 各位小伙伴,到上一篇博文为止,我们的内存模型相关知识就已经讲完了!讲!完!了!不知道大家吸收了多少,这里我们简单的来回顾一下吧! 内存基本分为Java栈、本地方法栈、堆和方法区。 首先栈存放的是基本类型变量,局部变量,和对象的引用,他在内存中是一块连续的区域,有大小限制,是由系统自动分配的,因此它的读写速度比较快,而且会自动释放掉为该变量所分转载 2017-05-26 08:46:01 · 238 阅读 · 0 评论 -
JVM进阶(十二)——JAVA 可视化分析工具
JVM进阶(十二)——JAVA 可视化分析工具 经过前几篇博文对堆内存以及垃圾收集机制的学习,相信小伙伴们已经建立了一套比较完整的理论体系!本篇博客就根据已有的理论知识,通过可视化工具来实践一番。 我们今天要讲解的工具位于JDK目录的bin目录下,大家可以发现该目录下有很多可执行文件,这里都是JDK为我们提供用于分析内存的一些工具。我们重点看看jconsole.exe,Java监视与管理转载 2017-05-26 08:45:27 · 2792 阅读 · 0 评论 -
JVM进阶(十一)——JAVA G1收集器
JVM进阶(十一)——JAVA G1收集器 在前两篇博文中讲解了新生代和年老代的收集器,在本篇博文中介绍一个收集范围涵盖整个堆的收集器——G1收集器。 先讲讲G1收集器的特点,他也是个多线程的收集器,能够充分利用多个CPU进行工作,收集方式也与CMS收集器类似,因此不会有太久的停顿。 虽然回收的范围是整个堆,但还是有分代回收的回收方式。在年轻代依然采用复制算法;年老代也同样采用“转载 2017-05-26 08:44:53 · 220 阅读 · 0 评论 -
JVM进阶(十)——JAVA 年老代收集器
JVM进阶(十)——JAVA 年老代收集器 在上一篇博文我们介绍了Java新生代收集器,本篇博文我们要讲的就是关于老年代的一些收集器。老年代存活的一般是大对象以及生命很顽强的对象,因此新生代的复制算法很明显不能适应该区域的特性,所以老年代采用的是“标记-清除-整理”算法(以前的博文有详细讨论过)。Serila Old收集器:该收集器是Serial收集器的老年代版,同样是一个单线程的收转载 2017-05-26 08:44:15 · 266 阅读 · 0 评论 -
JVM进阶(九)——JAVA 年轻代收集器
JAVA 年轻代收集器 继续上一篇博文所讲的,STW即GC时候的停顿时间,他会暂停我们程序中的所有线程。如果STW所用的时间长而且次数多的话,那么我们整个系统稳定性以及可用性将大大降低。 因此我们在必要的时候需要对虚拟机进行调优,调优的主要目标之一就是降低STW的时间,也就是减少Full GC的次数。那么这里我们从调优的角度来分析各个收集器的优势与不足。 首先从作用于年轻转载 2017-05-26 08:43:24 · 500 阅读 · 0 评论 -
JVM进阶(八)——Stop The World
JVM进阶(八)——Stop The World 小伙伴还记得上一篇中我们留下的一个问题吗?什么是停顿类型!经过前几章的学习,我们知道垃圾回收首先是要经过标记的。对象被标记后就会根据不同的区域采用不同的收集方法。看上去很完美的一件事情,其实并不然。 大家有没有想过一件事情,当虚拟机完成两次标记后,便确认了可以回收的对象。但是,垃圾回收并不会阻塞我们程序的线程,他是与当前程序并发执行转载 2017-05-26 08:42:51 · 1899 阅读 · 0 评论 -
JVM进阶(七)——从GC日志分析堆内存
JVM进阶(七)——从GC日志分析堆内存 在前面的文章中,我们只设置了整个堆的内存大小。但是我们知道,堆又分为了新生代,年老代。他们之间的内存怎么分配呢?新生代又分为Eden和Survivor,他们的比例大小能改变吗?其实这些都是可控的,以前没有讲到是因为就算讲了也只是讲讲而已,看不到实质性的东西。因此这章我们通过分析GC日志来一步步讲解如何细化设置堆内存。 首先我们来了解几个相关转载 2017-05-26 08:42:15 · 311 阅读 · 0 评论 -
JVM进阶(五)——JAVA GC之标记
JVM进阶(五)——GC之标记前言 堆分为年轻代和年老代。永久代是非堆内存,它又叫做方法区(一般的说法),主要存储已被加载的类信息、常量、静态变量。而该区域在java8已被删除,取而代之的是元空间,我会在后面的章节细讲。什么是标记?怎么标记? 第一个问题相信大家都知道,标记就是对一些已死的对象打上记号,方便垃圾收集器的清理。 至于怎么标记,一般有两种方法:引用计数和可达性分析。转载 2017-05-26 08:40:49 · 294 阅读 · 0 评论