一、JVM体系结构图
我们所谓的JVM调优就是调整 堆(heap),一定不会有垃圾的是栈(stack)
二、类加载器 Class Loader
正向:new 反向:getClass()
反向获取类记载器:getClassLoader()
类的加载、连接和初始化
1、加载:查找并加载类的二进制数据
2、连接:
把 Java 编译成 Class 的时候,虚拟机并不知道所引用的地址,助记符:符号引用 转化为真正的直接引用,找到对应的直接地址
3、初始化:给类的静态变量赋值,正确的值
JVM 参数:-XX:+TraceClassLoading //用于追踪类的加载信息并打印出来
final 常量在编译阶段的时候,会进入调用类的常量池,调用时不会触发常量所有类的初始化。但当一个常量的值并非编译期间可以明确,那这个值就不会被放到调用类的常量池中,调用时会触发常量所有类的初始化。
ClassLoader 分类
1、java 虚拟机自带的加载器
2、用户自己定义的加载器
JVM有机制保护自己的安全:顺序:BootStrap -> Ext -> App
双亲委派机制:一层层让父类去加载,如果顶层加载器不能加载,然后再向下类推
保护java的核心类不会被自己的定义的类替换
三、native 方法
native关键字,说明java的作用范围达不到,只能调用C语言库
JNI:java native interface(java本地方法接口)
四、程序计数器
五、方法区
method Area 方法区,是java 虚拟机规范定义的运行时数据区一致,和堆(heap)一样可以再线程之间共享
JDK1.7前:
永久代:用于存储一些虚拟机加载类的信息,空间有限,如果存满了:OutofMemoryError:PermGen
JDK1.8后:
彻底将永久代移除HotSpot JVM
信息会存入到Java Heap 或 Metaspcace(Native Heap)元空间
元空间就是方法区在 HotSpot JVM的实现
元空间和永久代的最大区别:元空间不在java虚拟机中,使用本地内存
-XX:MetasapceSize 10M //设置元空间大小
如果元空间满了,OutofMemoryError:MetaSpace
六、栈 Stack
程序 = 数据结构 + 算法
栈和队列都是基本的数据结构
程序的运行就是压栈的过程
吃多了拉,上进下出,队列,喝多了吐,上进上出,栈
栈是管理程序运行的,栈的存取速度快,仅次于寄存器,栈的数据不可以共享
StackOverFlow : 栈溢出
栈里一定不会存在垃圾回收的问题,只要线程一旦结束,该栈就Over,生命周期和线程一致
原文:https://www.cnblogs.com/xbflovetj/p/12458583.html