GC相关
GC回收机制及算法
对于堆内存中的对象,在用完之后不会立即回收,而是在某个时刻被回收。将堆内存分为两块---新生代和老生代。新生代又划分为伊甸园区和幸存区,一个对象刚创建的时候是放到伊甸园区,在伊甸园区经过一次扫描之后,如果这个对象已经不被引用,则释放内存;如果依然被引用,则挪到新生代的幸存区中;幸存区的扫描频率会略低于伊甸园区;在幸存区经过多次扫描之后,如果这个对象依然存在,则挪到老生的,老声带的扫描频率远远低于新生代。老生代中的一旦产生回收,则会导致程序的卡顿甚至崩溃。
1.垃圾回收关注的是堆内存
(1)JVM中java内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生灭,这3个区域的内存分配和回收都具备确定性,不需要过多考虑回收问题;
(2)堆后和方法区不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也不一样,只有在程序处于运行时期时才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,因此垃圾收集器所关注的是java的堆内存。
2.如何确定该实例是否可以被回收及算法
(1)引用计数算法
实现简单,效率高;
给对象中添加一个计数器,当有一个地方引用它时+1,引用失效时-1;
很难解决对象之间相互循环引用的问题;
(2)可达性算法
通过一系列称为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,证明此对象不可用;
3.垃圾收集算法
(1)标记-清除算法
标记所有需要回收的对象,在标记完成后统一回收;
标记和清除两个过程的效率都不高;
空间问题,标记清除后会产生大量不连续的内存碎片,空间碎片太多会导致运行过程中需要分配较大对象时,无找到足够的连续空间,而不得不提前触发一次垃圾收集;
(2)复制算法
将内存划分为等大的两块,每次只使用其中的一块,当一块的内存用完后将存活的对象复制到另一块上,在把已使用过的内存空间一次清理掉;
(3)标记-整理算法
过程类似于“标记-整理”,后续将所有存活对象都向一端移动,然后直接清理掉端边以外的内存
(4)分代收集算法
4.GC收集器
5.何时触发full GC
(1)旧生代空间不足:一般会在新生代晋升为旧生代对象时,或者创建大对象,大数组时出现空间不足,OutOfMemoryError异常
(2)Minor GC晋升到旧生代的平均大小>旧生代的剩余空间
HTTP协议
(1)概述
HTTP协议(超文本传输协议)
应用于应用层;
基于TCP/IP通信协议来传递数据(HTML文件,图片文件...)
工作与客户端-服务器端架构上,浏览器作为HTTP客户端通过URL向HTTP服务器端即web服务器发送所有请求,web根据请求发送响应信息;
(2)主要特点:
①简单快速:客户发送请求时,只需传送请求方法和路径,常用方法有GET、POST;
②灵活:HTTP允许传输任意类型的数据对象,由Context-Type加以标记;
③无连接:限制每次连接只处理一个请求,服务器处理完请求并受到客户的应答后,即断开连接,节省传输时间;
④无状态:指协议对事物处理没有记忆能力,不需要先前信息,以此它的应答较快;
⑤支持B/S及C/S模式
(3)HTTP之URL
HTTP使用统一资源标识符来传输数据和建立连接;
协议部分://域名部分:端口部分/虚拟目录部分/文件名部分?参数部分
URI是一种抽象的,高层次概念定义统一资源标识符,URL和URN则是资源标识的方式;
(4)HTTP之请求消息Request
客户端发送一个HTTP请求消息格式:
①请求行:用来说明请求类型,要访问的资源和所使用的HTTP版本;
②请求头:用来说明服务器要使用的附加信息;
③空行:请求头后的空行是必须的;
④请求数据:也叫主体,可以增加人员的其他数据;
(5)HTTP之响应
服务器接收并处理客户端发送过来的请求后会返回一个HTTP响应消息
①状态行:HTTP版本号,状态码,状态消息;
②消息报头:用来说明客户端要使用的一些附加信息;
③空行:
④响应正文:服务器返回给客户端的文本信息
(6)HTTP之状态码:
1xx:提示信息
2xx:成功
3xx:重定向
4xx:客户端错误
5xx:服务器端错误
JVM相关
一、工作原理:
.java源文件经过前端编译器编译为java字节码文件(.class);
然后JRE加载字节码文件,载入系统分配到jvm的内存区;
然后执行引擎解释或编译类文件,再由即时编译器将字节码转换为机器码;
二、字节码在运行时数据区执行步骤
载入:将系统中的.class文件载入到运行时数据区;
认证:检查载入类文件是否符合java规范和虚拟机规范;
准备:为载入类分配所需内存,确定类的属性,方法等所需要的数据结构;
解析:将该类常量池中的符号引用变为直接引用;
初始化:初始化类的局部变量,为静态域赋值,同时执行静态代码块;
三、运行时数据区:
(1)java虚拟机栈
线程私有,生命周期与线程相同
虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息;
每个方法从调用到完成过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程;
①局部变量表:包含了方法执行过程中的所有变量,方法参数;
②操作数栈:对于每个方法的调用,jvm都会创建一个操作数栈,以供计算;
③动态链接:每个栈帧内部都包含一个指向运行时常量池的引用;
long和double占用两个局部变量数组的两个连续位置64位双精度,其余的数据类型占一个
(2)java堆
被进程的所有线程共享,在虚拟机启动时被创建,唯一目的是存放对象的实例,所有的对象和数组都在堆上分配;
java堆是垃圾收集器管理的主要区域,由于现在的收集器基本都采用分代收集算法,细分为新生代和老生代...;
(3)方法区
用于存储已被虚拟机加载的类信息,常量,静态变量;
运行时常量池是方法区的一部分,用于存储编译期生成的各种字面量和符号应用,这部分内容在类加载后进入方法区的运行时常量池中存放
(4)本地方法栈:
与虚拟机栈类似,区别是虚拟机使用的native方法服务(一个接口,实现非java编写的代码)
(5)程序计数器:
可看做是当前线程锁执行的字节码的行号指示器,通过改变计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复都依赖这个计数器完成;
四、OutOfMemoryError异常
(1)java堆溢出:
创建对象数量达到最大堆容量限制后产生内存溢出
(2)栈溢出:
①线程请求的栈深度(受栈帧影响,栈帧中的局部变量越多栈帧越大,栈深度越小)大于虚拟机所允许的最大深度,抛出StackOverflowError
②虚拟机在扩展栈时无法申请到足够的内存空间,抛出OutOfMemoryError
③单线程下,无论栈帧太大还是虚拟机容量太小都抛出StackOverflowError
(3)方法区溢出
内存溢出
应用的内存已经不能满足正常使用,栈堆已经达到系统设置的最大值;
相比于内存泄漏:指应用使用资源之后没有及时释放,导致应用内存中持有了不需要的资源,这是一种状态描述
话说反射
一、概述:通过xx.class文件,能够拿到该类相关的所有资源,例如:该类所在位置,通过该类创建一个对象,获取这个对象的所有共有,私有方法及属性;
二、方法总结
1.使用步骤
//得到调用的类的class
Class cls=Class.forName(“类的全路径名”)
//得到要调用的类中的方法
Method m=cls.getDeclaredMethod(“方法名”,类型.class)
//方法调用
m.invoke(cls.newInstance(),参数)
2.static方法的反射调用
Class cls=Class.forName("")
Method m=cls.getDeclaredMethod()
m.invoke(cls,参数)
3.private修饰的成员变量赋值
Field field=cls.getDeclaredMethod("age");
field.setAccessible(true)
field.set(cls.newInstance,10)
有关集合
分两大类,Map和Collection
一、collection
接口是集合的根接口,java中没有提供这个接口的直接实现类,但让其被继承产生两个接口,Set和List
(1)Set:无序,元素不可重复,
(2)List:有序,元素可重复,
ArrayList:基于数组,内存空间连续,便查询;非同步
LinkList:基于链表,内存空间不连续,便增删;非同步
Vector:与ArrayList类似;同步线程安全
(3)Queue:通常但不一定是先进先出
二、Map
(1)HashMap:允许键值为null;异步式线程不安全;初始容量为16,填充因子0.75
(2)Hashtable:不允许键值为null;同步式线程安全;每个方法都加入了Synchronized;初始容量为11,填充因子0.75
(3)concurrentHashMap:异步式线程安全