jvm
1、jvm的体系结构–大致流程图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3h0Fas8Y-1633614596441)(E:\typora\java并发编程\jvm大致流程图.png)]
1.1类加载器以及双亲委派机制
类加载器:
1.启动类加载器:Bootstrap classLoader:主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和APPClassLoader
2.扩展类加载器:主要负责加载jre/lib/ext目录下的一些扩展的jar。
3.应用类加载器:主要负责加载应用程序的主函数类
双亲委派机制:
当class文件将要执行时,不考虑我们定义类加载器,那么就会一直去找父类直到找到我们的最终父类也就是启动类加载器。一般情况下去获取最终父类会返回null,大致是因为石油c/c++写的我们没有权限访问
1.3沙箱安全机制
默认本地代码为信任默认安全的,而远程的代码就可能会由病毒之类的,所以我们需要给一些权限
1.4 方法区-----native
方法区是被所有线程共享,所有的字节码
主要存储:静态常量、常量、类信息
static、final、class、常量池
-----————————
凡是加了native方法说明java的作用达不到了,会去调用C语言的库
public class jjk{
public static void main(String[] args){
}
//不会报错
private native void hello();
}
作用:扩展java的使用,融合不同的编程语言为java使用
*** 不常用,除非调用硬件的问题
2 栈
数据结构
程序=数据结构+算法
程序=框架+业务逻辑
2.1特点
先进后出、后进先出
---->对比 队列 先进先出(FIFO)
2.2 栈内存
主管程序的运行,生命周期和线程同步 ,栈结束栈内存就释放了,不会存在垃圾
8大基本类型+对象引用+实例方法
运行原理:栈帧
3中jvm
java -version查看自己用的什么jvm
我们常用的是Sun公司的HotStop
4 堆
一个jvm只有一个堆内存,堆内存的大小是可以调节的(由于只有一个堆所以有许多的垃圾)
一般存储:类、方法、常量、变量,引用类的真实对象
- 新生区
- 养老区
- 永久区
gc:垃圾回收主要是在一点区和养老区
内存满了就是oom,堆内存不够了
4.1 新生区
- 类诞生和死亡的地方
- 伊甸区:所有的对象在这个去里面new出来的
4.2永久区
- jdk1.6:永久代,常量池在方法区
- jdk1.7: 永久代,慢慢退化了,去永久代,常量池在堆中
- jdk1.8:无永久代,常量池在云空间
调优:-Xms1024m -Xmx1024m -Xx:PrintGCDetails
-Xms1m -Xmx8m -Xx:+HeapDumpOn(加异常错误)
工具:JProfiler
- 分析dump内存文件,快速定位内存泄漏
- 获得堆内存中的数据
- 获得大的对象
5 垃圾回收机制
垃圾产生于方法区和堆 --GC
GC分为:重GC(全局)和轻GC
5.1引用计数法
基本没有用,当new一个对象时就+1不用时就减1 当为0时就清楚
5.2 标记清楚法
对存活的对象进行标记
当使用完后就会再去扫描:没有标记的就会被清除
优点:不会占用空间
取点:两次扫描浪费时间,会产生内存碎片
5.3 复制算法
— 谁空谁是to
当存活经过enda区进入from和to区 就会把from区里面复制给to区,此时空的为to区有的那个为from区;一般情况当对象经历15次后就会进入老年区