- 博客(16)
- 收藏
- 关注
原创 Spring IOC与DI理解
IOC:控制反转(依赖倒置原理)类所依赖的类,不由类直接创建,而是由不相关的第三方资源(类)创建。实现了由上层类对下层类的控制,控制减轻了由于硬编码带来的类之间强耦合关系。IOC有两种是实现方式:依赖注入(DI)和依赖查询(DL)DI:依赖注入依赖注入有三种方式:Construction注入、Setter注入和Interface注入。Spring中的IOC容器,先扫描整个应用程序与XML文件,通过...
2018-06-26 14:21:50
121
1
转载 Java JVM类加载器
在JVM虚拟机中,绝大部分类都会使用到以下三种类加载器:1.启动类加载器(Bootstrap ClassLoader)——这个加载器负责将存放在<JAVA_HOME>\lib下,或者是被-Xbootclasspath参数所指定的路径中的,并且可以被虚拟机识别的类库加载到虚拟机内存中。2.扩展类加载器(Extension ClassLoader)——这个加载器是负责加载<JAVA_...
2018-06-16 16:23:35
267
原创 Java JVM类加载机制
类从被加载到虚拟机内存中开始,到卸载出内存为止,他的整个生命周期包括:加载、验证、准备、解析、初始化、使用、和卸载。这些阶段通常都是相互交叉混合式的进行。1.加载:在加载阶段,虚拟机要完成3件事情:——通过一个类的全限定名来获取定义此类的二进制字节流。——将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。——在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个...
2018-06-15 00:54:42
117
原创 Java HotSpot虚拟机垃圾收集器
1.名词定义OopMap数据结构:可以把oopMap简单理解成是调试信息。在源代码里面每个变量都是有类型的,但是编译之后的代码就只有变量在栈上的位置了。oopMap就是一个附加的信息,告诉你栈上哪个位置本来是个什么东西。 这个信息是在JIT编译时跟机器码一起产生的。因为只有编译器知道源代码跟产生的代码的对应关系。 每个方法可能会有好几个oopMap,就是根据safepoint把一个方法的代码分成几...
2018-06-12 23:25:47
194
原创 Java JVM GC原理
绝大部分内存回收时发生在JVM的堆(用来存储对象实例)上的1.GC回收判断对象已死的算法1)引用计数算法:给对象中添加个引用计数器,每当有地方引用它时,计数器+1;失去引用时,计数器-1;优点:判定效率高,在大部分情况下都是一个不错的算法。缺点:很难解决对象之间的相互引用的问题。ps:JVM中自带的HotSpot并没有使用应勇计数算法,而是使用了可达性分析法算法public class Refer...
2018-06-12 14:48:56
829
原创 JAVA OutOfMemoryError异常
1.java堆溢出java堆用来存储实例对象,当对象数量到达最大堆的容量限制后就会产生内存溢出异常,可通过设置堆的最小值(-Xms参数)与堆的最大值参数(-Xmx参数)设置为一样可避免堆的自动扩展。可通过参数-XX:+HeadDumpOnOutOfMemoryError让虚拟机内存溢出时Dump出当前的内存堆转储快照以便事后进行分析当出现java堆内存溢出时,异常堆栈信息“java.lang.Ou...
2018-06-11 15:21:40
409
转载 JVM参数大全
JVM命令行选项主要有3类:标准选项(eg:-client)、非标准选项(eg:-Xmxsize)、非稳定选项(eg:-XX:+AggressiveOpts)。选项使用说明: -XX:+option 启用选项 -XX:-option 不启用选项 -XX:option=number 给选项设置一个数字类型值,可跟单位,例如 128k, 256m, 1g -XX:option=string 给选项设置...
2018-06-11 14:12:17
245
转载 JAVA对象的访问定位
建立对象是为了使用对象,我们java程序需要通过栈上的reference数据来操作堆上的具体对象1、如果使用句柄访问的话,那么java堆中将会划分出一块内存作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象的实例数据与类型数据各自的具体地址信息。 2、如果使用直接指针访问,那么java堆对象的布局就必须考虑如何放置访问类型数据的相关信息,而reference中存储的直接...
2018-06-11 11:38:55
270
原创 JVM对象的创建与对象的内存布局
对象在内存中的创建顺序:1.进行类加载检查 new一个对象时,首先将去检查这个指令的参数是否在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已经被加载,解析和初始化过。如果没有,那必须执行相应的类加载过程。2.为新生对象划分内存 划分内存有以下两种方式: 1):指针碰撞假设java堆中是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一...
2018-06-10 15:22:21
135
原创 Java运行时数据区域(jvm内存分配)
线程独有区域: 程序计数器: 是JVM分配的较小的一块内存空间,它可以看作是当前线程所执行的字节码的行号指示器。 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。 虚拟机栈: 描述的是java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接方法出口等信息。 ...
2018-06-10 13:54:31
136
原创 JAVA协变返回类型
协变返回类型定义:在面向对象程序设计中,协变返回类型指的是子类中的成员函数的返回值类型不必严格等同于父类中被重写的成员函数的返回值类型,而可以是更"狭窄"的类型。public class TestRun { public static void main(String[] args) { A a = new A(); B b = new B(); System.out.println...
2018-06-07 21:06:42
161
原创 Java动态绑定与静态绑定
静态绑定: 定义:1)在编译时期前进行的绑定 2)使用private,static,final修饰的变量或方法,使用静态绑定,共同特点是他们都不适用多态。 3)重载是静态绑定动态绑定 定义:1)由于在编译时不确定对象的类型,而在程序运行时进行的绑定 2)在被子类重写的虚方法,会根据运行时的对象类型进行动态绑定...
2018-06-07 20:29:26
154
转载 Java初始化顺序
Java类和对象初始化类的生命周期:Java类的初始化:本阶段负责为类变量赋正确的初始值。(类变量即静态变量)Java编译器把所有的类变量初始化语句和静态初始化器通通收集到<clinit>方法中,该方法只能被JVM调用,专门承担初始化工作。初始化一个类必须保证其直接超类已被初始化。并非所有类都拥有<clinit>()方法。以下类不会拥有<clinit>方法:该类...
2018-06-05 20:28:19
103
原创 Java对象与基本类型赋值
取自Think in Java:赋值使用操作符“=”,它的意思是“取右边的值,把它复制给左边的值”,右值可以是任何常数、变量和表达式,但左值必须是一个明确的已命名的变量。对基本类型的赋值还是很简单的。基本类型存储了实际的数值,而非指向一个对象的引用(包装类也是如此)。在遍历包装类型的list时,将遍历出来的值 赋值 给Integer包装类对象,并对对象的值进行改变。结果原list中的Integer...
2018-06-05 20:06:50
1922
原创 JAVA 关键字final
JAVA final关键字可对变量(Field),方法(Method),类(Class)进行修饰1)final修饰成员变量 final修饰的成员变量只能初始化一次且必须赋值,初始化赋值后不能修改。 final修饰的成员变量有三个地方可以赋值初始化:变量声明时、static块中、构造方法中。2)final修饰方法(Method)被final修饰的方法不能被重写class A{ public fin...
2018-06-04 21:35:16
107
原创 JAVA关键字static
JAVA static关键字可对变量(Field)、方法(Method)、代码块、内部类(Class)进行修饰1)static变量当static修饰成员变量(Field)时,会在JVM的静态域中创建其变量,其在内存中只有一个副本,且仅当在类初次通过JVM加载时会被初始化。static成员变量的初始化顺序按照定义的顺序进行初始化。2)static代码块当static修饰代码块时,在类(Class)初...
2018-06-04 21:10:50
260
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人