jdk:java开发工具包
jdk=jre+java的开发工具(javac java javadoc jar等)
jre:java运行环境
jre=jvm+lib类库
jvm:java虚拟机 实现跨平台
jdk>jre>jvm
类的加载(字节码的加载):
hello.java-编译 --通过后--Hello.class(字节码文件或者类文件)----通过类加载器(ClassLoader)将类文件加载到 内存中
ClassLoader:将字节码文件(类文件)加载到jvm内存中
常见的类加载器:
BootstrpClassLoader:主要加载系统的类文件 jdk/jre/lib/rt.jar
ExeClassLoader:加载的时口占的类文件 ext文件夹下的jar包
AppClassLoader:加载的是应用程序中的类文件
自定义类加载器:
类加载器(懒汉):先让父classlader来加载,加载不成,再让父classloader的父classloader加载当所有的父classloader都加载不成,本classloader加载
双亲委托模式 |
按需求加载(懒加载)
import java.util.*;
.class 类文件记载的具体过程:
加载途径:本地系统(classpath)网络 jar包 等。
链接:验证加载的.class文件是否正确 ,然后解析、
初始化:静态变量等赋初始值 分配静态空间
使用:class method field
卸载
======================
JVM的内存区域:
程序计数器:每个线程独有的,各有各的 互不影响
记录字节码执行的行号。
本地方法栈:主服务于 native方法的栈 类似于 虚拟栈,也会出现溢出的现象。
内存溢出:Stack'OverFlowError和OutOfMemoryError
内存泄漏:产生了垃圾对象 但是因为各种原因 出现不能回收的现象
堆:heap
各个线程共享的数据
存放的对象的 数组对象等
可能会产生 内存溢出的现象
新生态:发生垃圾回收频繁 MinorGC(回收站),分为Eden区(出生区 )、SercicorFrom(上次幸存者,这次扫描者)、SercicorTo(保留幸存者)三个区
老年代:经常用
永久代:class和元数据
虚拟机栈(Stack):
主要用于存储 局部变量,操作数栈,每个线程都会有自己的虚拟机栈和线程同时创建
方法区:
在虚拟机启动时被创建,方法去是堆的逻辑组成部分,但是可以选择在该区域不实现垃圾收集
存储了每一个类的结构信息
=======================================
垃圾回收:
什么是垃圾(垃圾对象):不再被使用的对象,
判定是否为垃圾的策略:
引用计数法:对象被引用一次(被使用一次)加一
引用失效: 减一
当计数为0时,判定为垃圾。
特点:简单、容易实现
根搜索算法(可达性分析):
从方法的入口进去,找到一个root(根)对象,向下执行,那个方法与根有关联
几种引用:
强引用:刚刚创建,非常明确的引用
软引用:有用,但不是必须,一般作为垃圾的第二梯队,内存不够时,就回收
弱引用:new StringBuffer(new String("aaa")):可有可无
虚引用:幻引用 垃圾回收期尽快回收。
垃圾回收的集体算法:
标记清除法:先标记,再清除。缺点:容易形成碎片,存放大对象麻烦。优点:简单
标记复制算法(copying):将内存分为两部分,将存活的对象,复制到另一部分区域。缺点:内存浪费大,优点:简单,高效,不会有碎片
标记整理算法(mark-Compack):标记是一样的,将碎片集中处理。
分代收集方法:Generational Collection
垃圾回收器(不同厂商出售):
Serial/Serial Old
ParNew
Gl
CMS
垃圾回收的几种类型:
MinGc
MajorGc/Full Gc
串行:
单个线程回收 用户线程全部暂停
并行:多个垃圾回收线程,用户线程暂停
并发:回收线程和用户线程 同时切换轮流执行