先解释YGC: 当对象生成在EDEN区失败时,出发一次YGC,先扫描EDEN区中的存活对象,进入S0区,S0放不下的进入OLD区,再扫描S1区,若存活次数超过阀值则进入OLD区,其它进入S0区,然后S0和S1交换一次. 那么当发生YGC时,JVM会首先检查老年代最大的可用连续空间是否大于新生代所有对象的总和,如果大于,那么这次YGC是安全的,如果不大于的话,JVM就需要判断HandlePromotionFailure是否允许空间分配担保. 允许分配担保: JVM继续检查老年代最大的可用连续空间是…
抛几个问题: 1.谁进行空间担保? JVM使用分代收集算法,将堆内存划分为年轻代和老年代,两块内存分别采用不同的垃圾回收算法,空间担保指的是老年代进行空间分配担保 2.什么是空间分配担保? 在发生Minor GC之前,虚拟机会检查老年代最大可用的连续空间是否大于新生代所有对象的总空间, 如果大于,则此次Minor GC是安全的 如果小于,则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败.如果HandlePromotionFailure=true,那么会继续检查老年…
自己闲着无聊写的,当然有些描述不是十分准确,毕竟一句话不能表达太多意思. 委托:把方法当做参数进行传递. 泛型:在类.方法中对使用的类型参数化. 匿名方法:委托及调用委托的简化版. Lambda表达式:匿名方法的进一步进化. 扩展方法:给现有类添加新的方法. LINQ: 将SQL方式的查询从数据库扩展到其它方面(集合对象,XML等). 反射:获取运行时类型信息. 部分类: 把一个类的声明分散到多个文件中. 类型推断:编译时自动推断类型. 匿名类型:封装只读属性的对象. 自动属性:编译器帮你自动生…
offset   元素相对文档的偏移 pageX, pageY 事件(鼠标)相对文档的偏移 注意:文档是指document, 而不是当前窗口,是包含了滚动位置的,即滚动条的位置对这些值是不产生影响的 position  元素相对父元素的偏移 scrollTop, scrollLeft 元素内滚动条的位置,如果元素内没有滚动条,则为0.注意:是元素内部的滚动条.…
JVM中的类加载 关于JVM中类的加载这部分知识在网上有太多的文章描述这部分的知识.但是多数文章都过于冗长,难以理解.这篇文章主要是一些我对JVM中类的加载的理解. 一.一句话概括 java在类加载的时候实际上就是把xxx.class文件读入JVM方法去,并在内存中生成class的对象. 二.那么Java中是怎么加载类的 1. 首先我们要了解类加载器 java 中有四种类加载器.从底向上依次是 BootStrapClassLoader: 负责加载 JAVA_HOME\lib 目录中的,或通过-X…
一.在JVM中什么是垃圾?如何判断一个对象是否可被回收?哪些对象可以作为GC Roots的根 垃圾就是在内存中已经不再被使用到的空间就是垃圾. 1.引用计数法: 内部使用一个计数器,当有对象被引用+1,没有就-1,但是没有办法解决循环引用的问题,JVM不采用此类回收法 2.枚举根节点可达性分析(GC Root) 它必须是一组活跃的引用 思路:通过一系列名为GC Roots的对象作为起始点,从这个被称为GC Root的对象开始向下进行搜索,如果一个对象达到GC Roots 没有任何的引用链相连时,…
JVM中对象的创建过程 对象的内存分配 虚拟机遇到一条 new 指令时,首先检查是否被类加载器加载,如果没有,那必须先执行相应的类加载过程. 类加载就是把 class 加载到 JVM 的运行时数据区的过程. 1)检查加载 首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用(符号引用 :符号引用以一组符号来描述所引用的目标),并且检查类是否已经被加载.解析和初始化过. 2)分配内存 接下来虚拟机将为新生对象分配内存.为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来…
虚拟机中的对象 对象的分配 虚拟机遇到一条new指令时:根据new的参数是否能在常量池中定位到一个类的符号引用,如果没有,说明还未定义该类,抛出ClassNotFoundException: 1)检查加载 先执行相应的类加载过程.如果没有,则进行类加载 2)分配内存 根据方法区的信息确定为该类分配的内存空间大小 指针碰撞(java堆内存空间规整的情况下使用) 接下来虚拟机将为新生对象分配内存.为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来. 如果Java堆中内存是绝对规整的…
前言 这篇博客主要来说说类与对象在JVM中是如何存储的,由于JVM是个非常庞大的课题,所以我会把他分成很多章节来细细阐述,具体的数量还没有决定,当然这不重要,重点在于是否可以在文章中学到东西,是否对JVM可以有一些更深的理解,当然这也是笔者自己写文章的初衷. 问题提出 我们在日常工作学习中所使用的Java语言,其最大的特点就是"跨平台",我们不用在不同的平台上编译两套不同的机器码,而可以做到"一次编译,到处运行",其跨平台最重要的一个因素就在于,Java语言并不直接…
说到JVM,总是绕不开垃圾回收,因为其是JVM的核心之一,因为对象的创建是非常频繁的,想要提高程序的执行效率,拥有一个高效的垃圾回收机制是必不可少的. 首先要明确,因为对象的创建只在堆中,所以垃圾回收主要发生在堆中,但是垃圾回收并不只是回收对象,也会回收一些废弃的常量和类对象.所以垃圾回收作用的位置是在堆和方法区上的. 垃圾的定位和执行 定位 当一个对象没有被引用时就可以被回收,但是问题是如何判断一个对象没有被引用呢?目前确定一个对象是否被引用有两种方法. 1.引用计数法.为对象创建一个计数器,…