虚拟机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. 【转载】SQL注入攻防入门详解

    滴答…滴答…的雨,欢迎大家光临我的博客. 学习是快乐的,教育是枯燥的. 博客园  首页  博问  闪存    联系  订阅 管理 随笔-58 评论-2028 文章-5  trackbacks-0 站长 ...

  2. kalilinux-权限提升

    meterpeter: 可以在 Meterpreter 使用 incognito 来开始模拟过程: use incognito 展示 incognito 的帮助文档,通过输入 help 命令: hel ...

  3. ping别的电脑出错

    原因ifconfig 电脑1:172.31.45.101 电脑2:172.31.188.232 http://ask.csdn.net/questions/178358 如何防止别人ping自己的电脑 ...

  4. Ubuntu 将应用程序 固定到快快速启动栏(以Sublime为例)

    因为Sublime Text并不是需要安装,所以缺少Ubuntu桌面运行的一些基本配置,比如不能将它加入桌面侧边的启动器. 而Ubuntu上也没有快捷方式的说法,而通过软件中心安装的软件就有图标,并能 ...

  5. Utimate Visual 2013 突然间无法新建项目工程解决

    问题: 我用的Win7 安装的VS2013,这一段时间用的好好的,突然间新建工程师向导页面跳转不过去... 解决: 参考:http://stackoverflow.com/questions/1225 ...

  6. 基于JSP+Servlet开发手机销售购物商城系统(前台+后台)源码

    基于JSP+Servlet开发手机销售购物商城系统(前台+后台) 开发环境: Windows操作系统 开发工具:Eclipse/MyEclipse+Jdk+Tomcat+MySQL数据库 运行效果图: ...

  7. Partition--分区切换

    现有数据表[dbo].[staging_TB1_20131018-104722]和分区表[dbo].[TB1],需要将分区表和数据表中做数据交换 CREATE TABLE [dbo].[staging ...

  8. C# Redis辅助类封装与简单聊天室的实现思路说明

    虽然redis api的功能比较齐全,但个人觉得为了更好的方便学习和使用,还是很有必有做一个类似DBHelper的帮助类 辅助类主要功能(代码会在最后放出来) 1. 事件监听: 重新配置广播时(主从同 ...

  9. DI 依赖注入之StructureMap框架

    DI  依赖注入之StructureMap框架 一.简叙: structureMap只是DI框架中的其中之一. 二.安装及使用: 1.懒人方法: 使用MVC5项目时,可以直接在nuget程序包中安装S ...

  10. 为什么要使用rem

    为什么要使用rem 今天2019年4月16号更新,模仿网易移动端的的写法: html { font-size: 13.33333vw } @media screen and (max-width:32 ...