虚拟机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. 流程控制语句(if、for、while、do while、switch、 break、continue)

    3:流程控制语句    (1)顺序结构 从上往下,依次执行    (2)选择结构    按照不同的选择,执行不同的代码    (3)循环结构 做一些重复的代码 4:if语句    (1)三种格式   ...

  2. Python 抓取html所有特定元素的方法

    直接上代码哦,够直接了吧~ from lxml import etree #import mechanize import lxml.html #import cookielib #br = mech ...

  3. Mysql主主复制+keepalived

    1>环境 Master1 10.0.0.201 Master2 10.0.0.202 2>Master1操作授权 mysql>grant replication slave on * ...

  4. [LeetCode 题解]: Permutation Sequcence

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  5. [LeetCode 题解]: Add Two Numbers

    You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...

  6. Arduino I2C + 三轴加速度计ADXL345

    ADXL345是ADI公司生产的三轴数字加速度计芯片,与ST的LIS3DH功能接近.主要特性有: 工作电压:2.0 ~ 3.6V 功耗:待机功耗0.1μA:工作时与数据输出频率(ODR)有关,如ODR ...

  7. Nutch2.2.1,window,eclipse,安装

    教程:https://app.yinxiang.com/shard/s12/sh/36b8e911-2d0e-4ee4-b34f-a426c6dc99c2/9543f94cd8abf12b4b9857 ...

  8. CentOS下Docker与.netcore(四)之 三剑客之一Docker-machine+jenkins简单自动化部署

    CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客 ...

  9. “全栈2019”Java第十章:关键字

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  10. 解决wordcloud的一个error:Microsoft Visual C++ 9.0 is required. Get it from http://aka.ms/vcpython27

    环境: 操作系统:Windows 7 64位 语言:Python 2.7.13 |Anaconda 4.4.0 (64-bit)| (default, May 11 2017, 13:17:26) w ...