标签:重复加载 启动 aic 管程 out dump 不用 园区 快速
2、JVM 的体系结构
3、类的加载器
当某个类加载器需要加载 .class 文件时,它首先把这个任务委托给他们的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会加载这个类
5、沙箱安全机制
JNI (本地方法接口) java native interface
// native :
? 1、凡是带了 native 关键字的,说明 java 的作用范围达不到了,会去调用底层 C 语言的库
2、会进入本地方法栈,调用 JNI, 调用本地方法库,
? JNI 的作用就是扩展 java 的使用,融合不同的语言为 java 所用,最初是 C、C++
所以在内存中开辟了一块区域,为了登记 native 方法,
3、调用其他接口其实还可以使用 Socket、WebService、http、rpc 、restful
Method Area:
方法区是被所有的线程共享,所有字段和方法字节码,以及一些特殊方法,如构造函数,接口代码也在此定义,简单说,所有定义的方法的信息都保存在该区域,此区域属于共享区间,
静态变量、常量、类信息(构造方法、接口定义),运行时的常量存在方法区中,但是实例变量存在堆内存中,和方法区无关
说白了就是:
? staic、 final、Class、常量池、、、
数据结构。栈和队列进行比较
栈:先进后出,后进先出
所以为什么 main 方法最后退出?
栈溢出、递归问题(死循环)、无限压栈 、压栈超过了栈的深度
栈溢出是指不断的调用方法,不断的压栈,最终超出了栈允许的栈的深度,最终超出了栈允许的栈深度,就会发生栈溢出,比如递归操作没有终止,死循环
主管程序的运行,生命周期和线程同步
线程结束,栈内存你就会释放
对于栈来说,没有垃圾回收的问题
栈里面放的东西:
队列: 先进先出 (FIFO)
无限字符串的例子 - 其实也就是无限 new 对象:
这个区域常驻内存的,用来存放 jdk 自身携带的 Class 对象,Interface 元数据,存储的是 java 运行时的一些环境或类信息,这个区域不存在垃圾回收,关闭虚拟机就会释放这个区域的内存
jdk1.6之前: 叫永久代,常量池是在方法区
jdk1.7: 永久带,但是慢慢的退化了,去永久代,常量池在堆中
jdk1.8之后:无永久代,常量池在元空间
能够看到代码第几行出错:
内存快照分析工具,MAT、Jprofiler
debug: 只能一行行的分析代码
14、对内存调优
Jvm 在进行 GC 时,并不是对以下三个区域统一回收,大部分时候,回收都是新生代,
1、JVM 的内存模型和分区 - 详细到每个区放什么?
2、堆里面的分区有哪些?
3、GC 的算法有哪些?
4、轻 GC 和 重 GC 分别在什么时候发生?
作用:缓存一致性协议,用于定义数据读写的规则(遵守,找到这个规则)
JMM 定义了线程的主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory)
CPU 中运行的线程从主存中拷贝共享对象 obj 到它的 CPU 缓存,把对象 obj 的 count 变量改为 2,但每个变量对运行在右边 CPU 中的线程不可见,因为这个更改还没有 flush 到主存中,要解决共享对象可见性这个问题,我们可以用 java volilate 关键字或者加锁
? JMM: 抽象的概念 - 理论
内存效率:
没有,没有最好的算法,只有最合适的算法 --->
每一代都有不同的算法
年轻代:
老年代:
区域大: 存活率
标记清除(内存碎片不是太多) + 标记压缩混合 实现
标签:重复加载 启动 aic 管程 out dump 不用 园区 快速
原文地址:https://www.cnblogs.com/jcjc/p/13520585.html