虚拟机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. .net 线程基础 ThreadPool 线程池

    1. ThreadPool 线程池异步: //public static bool QueueUserWorkItem(WaitCallback callBack); //public static ...

  2. Java50道经典习题-程序3 打印水仙花数

    题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数",因为153=1 ...

  3. 前端jq设置下拉框的,单选框,复选框的帖子

    $(function(){ var sex=$("#sex").val(); var marriageStatus=$("#marriageStatus").v ...

  4. C# 数字转换成汉字大写 数值转换成汉字大写

    1.数字转换成汉字大写 public string NumToChinese(string x) { //数字转换为中文后的数组 //转载请注明来自 http://www.shang11.com st ...

  5. PostgreSQL按年月日分组

    Select EXTRACT(year from cast(joindate as timestamp)) as Year, EXTRACT(month from cast(joindate as t ...

  6. Ocelot Consul ACL

    Ocelot允许您指定服务发现提供程序,并使用它来查找Ocelot正在将请求转发给下游服务的主机和端口.目前,这仅在GlobalConfiguration部分中受支持,这意味着所有ReRoute将使用 ...

  7. 使用PHPstudy在Windows服务器下部署PHP系统

    PHP网站一般运行在Apache服务器上,IIS服务器上也可以运行,但是不推荐,windows服务器上没有集成Apache跟PHP的运行环境,但是借助第三方的软件就能很好的搞定,一般这样的软件有很多, ...

  8. How to Mount a Remote Folder using SSH on Ubuntu

    Connecting to a server across the internet is much more secure using SSH. There is a way that you ca ...

  9. bzoj4199: [Noi2015]品酒大会(后缀数组)

    题目描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加. 在大会的晚餐上,调酒师 Rainb ...

  10. Oracle数据库中日期/数字和字符之间的转换和计算

    --查出当前系统时间 select SYSDATE from table; --格式转换 -- TO_CHAR 把日期或数字转换为字符串 -- TO_CHAR(number, '格式') -- TO_ ...