一.类加载的时机 类的生命周期 类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括以下 7 个阶段: 加载 验证 准备 解析 初始化 使用 卸载 验证.准备.解析 3 个阶段统称为连接. 加载.验证.准备.初始化和卸载这 5 个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始(注意是"开始",而不是"进行"或"完成"),而解析阶段则不一定:它在某些情况下可以在初始化后再开始,这是为了支持 Java 语言的运行时绑定.…
内存分配与回收策略 对象的内存分配,就是在堆上分配(也可能经过 JIT 编译后被拆散为标量类型并间接在栈上分配),对象主要分配在新生代的 Eden 区上,少数情况下可能直接分配在老年代,分配规则不固定,取决于当前使用的垃圾收集器组合以及相关的参数配置. 以下列举几条最普遍的内存分配规则,供大家学习. 对象优先在 Eden 分配 大多数情况下,对象在新生代 Eden 区中分配.当 Eden 区没有足够空间进行分配时,虚拟机将发起一次 Minor GC. Minor GC vs Major GC/F…
java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类装载器和安全管理器是可以被动态扩展的,或者说,他们是可以由用户自己定制的,今天我们就是动手试试,怎么做这部分的实践,当然,在阅读本篇之前,至少要阅读过笔记三. 下面我们先来动态扩展一个类装载器,当然这只是一个比较小的demo,旨在让大家有个比较形象的概念. 第一步,首先定义自己的类装载器,从Clas…
接近两个月左右没有写博客,主要是因为小孩过来后,回家比较忙,现在小孩端午送回家了,开始继续之前的JVM学习之路,前面学习了GC的算法和种类,那么本章则是基于算法来产生实际的用途,即垃圾收集器. 一.堆的回顾 新生代中的98%对象都是“朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块比较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor.当回收时,将Eden和Survivor中还存活着的对象一次性地复制到另外一块Survivor…
http://www.hongyanliren.com/2014m12/22797.html 1: 通知(advice): 就是你想要的功能,也就是安全.事物.日子等.先定义好,在想用的地方用一下.包含Aspect的一段代码2: 连接点(joinPoint): spring允许你通知的地方,很多,基本每个方法的前.后,或抛出异常时都可以是连接点. spring 只支持方法连接点. 其它如AspectJ还可以让你在构造器或属性注入时都行.3: 切入点(pointcut): 一个类,15个方法,就是…
在强化学习(十四) Actor-Critic中,我们讨论了Actor-Critic的算法流程,但是由于普通的Actor-Critic算法难以收敛,需要一些其他的优化.而Asynchronous Advantage Actor-critic(以下简称A3C)就是其中比较好的优化算法.本文我们讨论A3C的算法原理和算法流程. 本文主要参考了A3C的论文,以及ICML 2016的deep RL tutorial. 1. A3C的引入 上一篇Actor-Critic算法的代码,其实很难收敛,无论怎么调参…
对象的内存布局 在 HotSpot 虚拟机中,对象的内存布局分为以下 3 块区域: 对象头(Header) 实例数据(Instance Data) 对齐填充(Padding) 对象头 对象头记录了对象在运行过程中所需要使用的一些数据: 哈希码 GC 分代年龄 锁状态标志 线程持有的锁 偏向线程 ID 偏向时间戳 对象头可能包含类型指针,通过该指针能确定对象属于哪个类.如果对象是一个数组,那么对象头还会包括数组长度. 实例数据 实例数据部分就是成员变量的值,其中包括父类成员变量和本类成员变量. 对…
类加载生命周期 类加载生命周期:加载.验证.准备.解析.初始化.使用.卸载 类加载或初始化过程什么时候开始? 遇到new.getstatic.putstatic或invokestatic这4条字节码指令时. 使用反射时,如果类没有初始化就触发其初始化 当初始化一个类时,如果其父类还没有初始化,则先初始化其父类 当虚拟机启动时,需要初始化主类. 类加载阶段 类加载的过程: 通过一个类的完全限定名获取定义此类的二进制字节流 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 在内存中生成一…
类文件结构 JVM 的"无关性" 谈论 JVM 的无关性,主要有以下两个: 平台无关性:任何操作系统都能运行 Java 代码 语言无关性: JVM 能运行除 Java 以外的其他代码 Java 源代码首先需要使用 Javac 编译器编译成 .class 文件,然后由 JVM 执行 .class 文件,从而程序开始运行. JVM 只认识 .class 文件,它不关心是何种语言生成了 .class 文件,只要 .class 文件符合 JVM 的规范就能运行. 目前已经有 JRuby.Jyt…
JVM 内存结构 Java 虚拟机的内存空间分为 5 个部分: 程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区 JDK 1.8 同 JDK 1.7 比,最大的差别就是:元数据区取代了永久代.元空间的本质和永久代类似,都是对 JVM 规范中方法区的实现.不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存. 程序计数器(PC 寄存器) 程序计数器的定义 程序计数器是一块较小的内存空间,是当前线程正在执行的那条字节码指令的地址.若当前线程正在执行的是一个本地方法,…
前面我们学习了很多JVM相关的理论知识,那么本节将重点讲述的是工具的使用,正所谓:工欲善其事,必先利其器.因此,本节介绍常用的性能监控工具,用于性能监控和问题排查. 一.系统性能监控 系统性能工具用于确定系统运行的整体状态,基本定位问题所在. Linux – uptime • 系统时间 • 运行时间 n 例子中为7分钟 • 连接数 n 每一个终端算一个连接 • 1,5,15分钟内的系统平均负载 n 运行队列中的平均进程数 – Top • 第一行同uptime • 第三行到第五行是CPU和内存的使…
一.中断函数注册方法: 1.格式: 配置某个功能的中断 注册中断函数 开启中断 2.一个例子 pit_init_ms(PIT0,);//定时中断初始化 set_vector_handler(PIT0_VECTORn ,PIT0_IRQHandler); //设置PIT0的中断服务函数为 PIT0_IRQHandler enable_irq (PIT0_IRQn);   二.ADC模块 1.ADC通道管脚对应表 typedef enum { // -------------------------…
距离上次介绍Jconsole已经时隔两周了,这期间由于工作中要用go来做一个新项目,所以精力都用在入门go上了,不过发现go语言用起来真的挺不错的,比python感觉还好点,大家没事可以了解下.     言归正传,VisualVM和Jconsole同是图形化的jvm监控和分析工具,两者在一些基本功能上的使用大同小异,比如内存.线程.jvm环境参数等,但是相对而言VisualVM的功能要稍强于Jconsole,相当于加强版的Jconsole.同是visualVM的一些高级功能是通过安装插件来拓展,…
之前扯了四篇理论,这一篇终于可以动动手了.本篇我们将介绍JVM常用的一些工具,这些工具将是我们监控JVM状态.处理故障和调优分析的利器. 不过在开始之前,我还是要先车扯两句:工具终归只是帮助我们我们处理问题的,想要快速准确的解决问题,最为关键的还是对内在理论的理解和丰富的实践经验,所以如果对JVM的内存处理机制不了解,还是要用心学习一下.好了, 子曰:“工欲善其事,必先利其器.“,下边开始介绍. 一.JDK命令行工具 所有的java开发人员都知道JDK的bin目录下存放着编译java需要的jav…
 欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类装载器和安全管理器是可以被动态扩展的,或者说,他们是可以由用户自己定制的,今天我们就是动手试试,怎么做这部分的实践,当然,在阅读本篇之前,至少要阅读过笔记三. 下面我们先来动态扩展一个类装载器,当然这只是一个比较小的demo,旨在让大家有个比较形象的概念. 第一步,首先…
此篇参考:salesforce 零基础学习(六十二)获取sObject中类型为Picklist的field values(含record type) 我们在lightning中在前台会经常碰到获取picklist的values然后使用select option进行渲染成下拉列表,此篇用于实现针对指定的sObject以及fieldName(Picklist类型)获取此字段对应的所有可用的values的公用组件.因为不同的record type可能设置不同的picklist values,所以还有另…
一.本章要点 可以为类.方法.字段.局部变量.参数.表达式.类型参数以及各种类型定义添加注解 对于表达式和类型,注解跟在被注解的条目之后 注解的形式有@Annotation.@Annotation(value)或@Annotation(name1=value1,...) @volatile.@transient.@strictfp.@native分别生成等效的Java修饰符 用@tailrec注解让你校验某个递归函数使用了尾递归化 assert函数利用了@elidable注解,可以从Scala程…
本篇参考:salesforce 零基础学习(六十二)获取sObject中类型为Picklist的field values(含record type) https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.reference_wire_adapters_picklist_values https://developer.salesforce.com/docs/component-librar…
一.引言 前面我们学习了JVM的垃圾回收机制,我们知道了垃圾回收是JVM的自发行为:虽然我们可以通过System.gc() 或Runtime.getRuntime().gc()进行显式调用垃圾回收 ,但JVM可以屏蔽掉显式的垃圾回收调用,且JVM也有自己的一套垃圾回收机制,那么我们有没有什么办法可以"告诉"JVM,哪些对象是可以使用以后回收,哪些对象保留呢?这里就要说一下JAVA对象的引用类型了. 二.对象引用的简单介绍 强引用:无论内存是否足够,不会回收. 软引用:内存不足时,回收该…
虚拟机和物理机的区别.两种都有代码执行能力.物理机的执行引擎是建立在处理器.硬件.指令集和操作系统上.而虚拟机的执行引擎是有自己实现的.因此可以自行的制定指令集和执行引擎的结构关系. 个人理解:分为三个部分.分别是介绍运行时分的各个内存区域[程序计数器.java虚拟机栈[局部变量表.操作数栈.动态链接.方法返回地址].本地方法栈.方法区.堆].方法的调用[解析.分派].方法的执行[解析执行.编译执行] 1. 运行时栈帧结构 栈帧是用于虚拟机进行方法调用和方法执行的数据结构.是虚拟机栈的栈元素.这…
在高性能硬件上部署程序,目前主要有两种方式: 通过 64 位 JDK 来使用大内存: 使用若干个 32 位虚拟机建立逻辑集群来利用硬件资源. 使用 64 位 JDK 管理大内存 堆内存变大后,虽然垃圾收集的频率减少了,但每次垃圾回收的时间变长. 如果堆内存为14 G,那么每次 Full GC 将长达数十秒.如果 Full GC 频繁发生,那么对于一个网站来说是无法忍受的. 对于用户交互性强.对停顿时间敏感的系统,可以给 Java 虚拟机分配超大堆的前提是有把握把应用程序的 Full GC 频率控…
注解Annotation又叫元数据,是JDK5中引入的一种以通用格式为程序提供配置信息的方式.使用注解Annotation可以使元数据写在程序源码中,使得代码看起来简洁,同时编译器也提供了对注解Annotation的类型检查,使得在编译期间就可以排除语法错误. 1JDK内置的3中Annotation: 在JDK5中,内置了3个通用目的的注解Annotation,这三个内置的注解在java.lang包下: (1).@Override: 这个注解常用在继承类或实现接口的子类方法上,表面该方法是子类覆…
之前本来打算结合自己写的小程序来介绍JConsole和VirtualVM的使用的,但是发现很难通过一个程序把所有的场景都体现出来,所以还是决定用书中的典型小例子来讲更加清晰. 一.JConsole的基本功能 JConsole是一个机遇JMX(Java Management Extensions,即Java管理扩展)的JVM监控与管理工具,监控主要体现在:堆栈内存.线程.CPU.类.VM信息这几个方面,而管理主要是对JMX MBean(managed beans,被管理的beans,是一系列资源,…
任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. 一.JSP模版元素 JSP页面中的HTML内容称之为JSP模版元素.  JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观. 二.JSP表达式 JSP脚本表达式(expression)用于将程序数据输出到客户端     语法:<%= 变量或表达式 %>     举例:输出当前系统时间: 1 <%= new java.util.Da…
Dart函数方法可分为两类: 一.内置方法/函数: print(); 二.自定义方法: 自定义方法的基本格式: 返回类型 方法名称(参数1,参数2,...){ 方法体 return 返回值; } void printInfo(){ print('我是一个自定义方法'); } int getNum(){ ; return myNum; } String printUserInfo(){ return 'this is UserInfo'; } List getList(){ ']; } void…
学习内容: MyBaits 以前从来没有接触过mybatis,通过今天的学习知道这是一个框架,适用于关注SQL优化和需要频繁更新的项目. 今天做一个关于mybatis项目的入门小程序,效果很不理想. 因为用于maven项目中,遇到两个问题 1.在项目下创建package或class文件时,出现“Source folder is not a Java project.”错误 解决方法:按照网上的解决方法,应该在项目中properties中找project facets,但都找不到是因为根本不在Ja…
1. 执行引擎概述 1.1 执行引擎 1.2 概述 执行引擎是Java虚拟机的核心组成部分之一. 虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器.缓存.指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式. JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,…
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的的整个生命周期包括: 加载(Loading),验证(Verification),准备(Preparation),解析(Resolution),初始化(Initialization),使用(Using)和卸载(Unloading)七个阶段. 其中验证,准备,解析三个阶段统称为链接(Linking),七个阶段发生的顺序如图所示: 加载,验证,解析,初始化,卸载这个5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班的开始,而解析阶段不一定:…
Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象,如下图所示: 在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old).新生代 ( Young ) 又被划分为三个区域:Eden.S0.S1. 这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收. Java 中的堆也是 GC 收集垃圾的主要区域.GC 分为两种:Minor GC.Full GC ( 或称为 Major GC ). 1.年轻代…
垃圾收集策略与算法 程序计数器.虚拟机栈.本地方法栈随线程而生,也随线程而灭:栈帧随着方法的开始而入栈,随着方法的结束而出栈.这几个区域的内存分配和回收都具有确定性,在这几个区域内不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了. 而对于 Java 堆和方法区,我们只有在程序运行期间才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,垃圾收集器所关注的正是这部分内存. 判定对象是否存活 若一个对象不被任何对象或变量引用,那么它就是无效对象,需要被回收. 引用计数…