虚拟机jvm

包括 类加载机制 ,运行时数据区域
运行时数据区域包括 ,程序计数器,虚拟机栈和本地方法栈,堆,方法区。
程序计数器是一块较小的内存控件, 用来指定当前字线程执行节码的行数 ,每个程序计数器都是线程私有的。
虚拟机栈,每个方法执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、方法出入口等信息。
每个方法的调用到执行过程就是一个栈帧从入栈道出栈的过程。局部变量包括基本数据、对象引用和返回地址等。
本地方法栈和虚拟机栈存的东西是一样的,只不过本地方法栈存的执行java方法的,本地方法栈存的是执行native方法的。
堆,存的是new 的对象 的实例,堆是垃圾回收的主要区域。堆里分新生代和老年代,新生代又分edan区 和两个suvive区 ,他们的比例是8比1.
方法区存的是class的构造函数,静态变量和常亮等。

垃圾回收机制: 引用记数法和可达性分析法 。
引用记数法就是 给每个对象做个标记,每多引用一次 就给该对象的标记加1 ,引用失效一次 就给该对象的标记减一,如果该对象的标记为0的话 ,则回收该对象
这种算法不能清除两个对象间互相引用的关系。

可达性分析法,是将GCRoots作为根,如果对象与GCRoots之间可以达到,有引用链 ,就证明该对象有用,否则就回收该对象。
可以作为GCRoots的 有 虚拟机栈的 数据引用,方法去里的 常亮引用和 静态变量引用。

堆中的对象清除的算法有 标记清除、标记复制和标记整理。
当一个对象被创建后首先会在eden区创建一块区域,直到当GC的时候,根据可达性算法,看一个对象是否消亡,没有消亡的对象会被放入到年轻代的suvivor区域并添
标记,消亡的直接被Minor GC kill 掉。
进入到suvivor区域的对象也不是安全的,当下一场Minor GC 来的时候还会检查Eden区域和suvivor区域中的对象是否存活,存活放入另一块suvivor区域。
当两个suvivor区域切换几次,会把标记为10的对象放入老年代,这个10 是可以设置的。
当老年区满的时候 会触发 FullGC 或则majorGC ,这个GC 会产生stop the world 现象 ,即所有的线程会被挂载起来,
一般应该尽量避免发生full gc。
标记清除 ,标记所有需要回收的对象,标记完成后统一回收。主要缺点是算法效率低,会造成不连续的空间,当存储较大对象的时候,会提前进行垃圾回收。
复制算法,主要解决效率问题,当一个空间满的时候 将存活的对象分配到另一个空间上,然后将使用的内存一次性清理掉,缺点是造成内存浪费,适用于新生代回收。
标记整理,基本过程仍与标记

强引用 : 垃圾回收器永远不会回收的引用对象。
软引用 : 描述一些有用但非必须的对象,在系统将要进行溢出前,会把这些对象列入回收对象的第二次回收。
弱引用 : 非必须的对象,比软引用更弱,软引用对象关联的对象只能生存到下一次垃圾回收之前,垃圾回收器工作时,无论内存是否足够,都会被回收。
虚引用: 完全不会对对象构成影响,也无法通过虚引用来获取对象实例,存在的目的是为了一个虚引用对象被回收时收到一个系统通知。

学习java虚拟机笔记的更多相关文章

  1. 开始记录学习java的笔记

    今天开始记录学习java的笔记,加油

  2. Java虚拟机笔记(五):JVM中对象的分代

    为什么要分代 为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用, ...

  3. Java虚拟机笔记(四):垃圾收集器

    前言 前一篇文章介绍了内存的垃圾收集算法,现在介绍下内存回收的具体实现--垃圾收集器. 由于Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商,不同版本的虚拟机所提供的垃圾收集 ...

  4. Java虚拟机笔记(三):垃圾收集算法

    一.标记-清除(Mark-Sweep)算法 标记清除算法是最基础的收集算法,其他收集算法都是基于这种思想. 标记清除算法分为“标记”和“清除”两个阶段:首先标记出需要回收的对象,标记完成之后统一清除对 ...

  5. Java虚拟机笔记(二):GC垃圾回收和对象的引用

    为什么要了解GC 我们都知道Java开发者在开发过程中是不需要关心对象的回收的,因为Java虚拟机的原因,它会自动回收那些失效的垃圾对象.那我们为什么还要去了解GC和内存分配呢? 答案很简单:当我们需 ...

  6. Java虚拟机笔记(一):类加载机制

    一.概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 二.类加载的生命周期 类从被加载到 ...

  7. java虚拟机笔记-1

    java虚拟机学习笔记 Java技术的核心就是Java虚拟机,因为所有的Java程序都在虚拟机上运行.Java程序的运行需要Java虚拟机.Java API和Java Class文件的配合.Java虚 ...

  8. 深入理解java虚拟机笔记Chapter12

    (本节笔记的线程收录在线程/并发相关的笔记中,未在此处提及) Java内存模型 Java 内存模型主要由以下三部分构成:1 个主内存.n 个线程.n 个工作内存(与线程一一对应) 主内存与工作内存 J ...

  9. [Java学习] Java虚拟机(JVM)以及跨平台原理

    相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的. 那么,跨平台是怎样实现的呢?这就 ...

随机推荐

  1. POJ 2546 Circular Area(两个圆相交的面积)

    题目链接 题意 : 给你两个圆的半径和圆心,让你求两个圆相交的面积大小. 思路 : 分三种情况讨论 假设半径小的圆为c1,半径大的圆为c2. c1的半径r1,圆心坐标(x1,y1).c2的半径r2,圆 ...

  2. struts2的validate输入验证

    原创 struts2的输入验证有两种方式: 使用validate()方法实现验证 使用验证文件实现验证 下面通过一个例子介绍validate()方法验证——实现客户注册输入验证 设计的JSP页面代码: ...

  3. UT源码 065

    NextDate函数问题 NextDate函数说明一种复杂的关系,即输入变量之间逻辑关系的复杂性 NextDate函数包含三个变量month.day和year,函数的输出为输入日期后一天的日期. 要求 ...

  4. 阿里云云主机添加swap分区与swap性能优化

    1.swap的功能与相应内核参数 Linux 将物理内存分为内存段的部分被称作“页面”.交换是指内存页面被复制到预先设定好的硬盘空间(叫做交换空间)的过程,目的是释放用于页面的内存.物理内存和交换空间 ...

  5. android app启动就闪退怎么办?

    开发过程中,如遇到android app启动就闪退,不要急,直接进入调试模式运行app,就会取得出错的原因. http://blog.sina.com.cn/s/blog_44fa172f0102wg ...

  6. Android-动态添加控件到ScrollView

    在实际开发过程中,会需要动态添加控件到ScrollView,就需要在Java代码中,找到ScrollView的孩子(ViewGroup),进行添加即可. Layout: <?xml versio ...

  7. duilib入门简明教程 -- 界面布局(9)

        上一个教程实现的标题栏代码中,并没有看到处理自适应窗口大小的代码,但是窗口大小变化后,按钮的位置会跟着变化,这是因为我们将按钮放到了HorizontalLayout.VerticalLayou ...

  8. HBase介绍 (1)---数据模型

    http://blog.csdn.net/heyutao007/article/details/5766896 BigTable是什么?Google的Paper对其作了充分的说明.字面上看就是一张大表 ...

  9. getpost请求

    // GET请求与获取结果 /// </summary> public static string HttpGet(string Url, string postDataStr) { Ht ...

  10. Ocelot Consul

    1首先创建一个json的配置文件,文件名随便取,我取Ocelot.json 这个配置文件有两种配置方式,第一种,手动填写 服务所在的ip和端口:第二种,用Consul进行服务发现 第一种如下: { & ...