链接:https://baobeihuijia.com/bbhj/contents/3/192489.html
将本地的字节码文件.class 加载到内存方法区中成为元数据模板(两个class对象是否为同一个类要求:完整类名包括包名一致+加载类的classloader要一致)
启动类加载器,用于提供JVM自身需要的类(除了启动类加载器,其他都继承自classloader)
扩展类加载器:从用户指定目录中加载类
应用程序类加载器:加载环境变量/系统属性指定路径下的类库,是程序中默认的类加载器
用户自定义类加载器
JAVA内存布局规定了java运行过程中内存申请,分配和管理的策略:
每个线程独立拥有程序计数器、栈、本地方法栈
线程共享,随虚拟机存亡的:方法区、堆
(由于cpu一直在线程中切换,利用程序计数器可以记住切回来后继续执行的位置【cpu时间片:cpu分给各个线程的时间段】)
pc寄存器用来存储指向下一条指令的地址/如果该线程执行的是native方法,则是未指定值
通过pc来控制程序的分支、循环、跳转等
字节码解释器就是通过pc来找到下一条即将要执行的字节码指令
是jvm中唯一一个没有规定任何outofmemoryerror情况的
Java方法内的局部变量是否线程安全问题_在方法中会产生线程安全问题吗对吗-CSDN博客
调用本地的一些基于C编写的程序时,采用本地方法栈来管理本地方法的调用
当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。它和虚拟机拥有同样的权限。
是JVM中分配内存最大的一块区域,如果内存大小超过-Xmx指定的最大内存就会抛出outofmemeryerror
为什么xms和xmx要设置成相同的值?【精选】jvm调优技巧 - 内存抖动 、Xms和Xmx参数为什么要设置相同的值_xmx和xms为什么要一样-CSDN博客
xms是发现空余堆内存大于阈值,jvm减小直到xms最小
xmx是发现空余堆内存小于阈值,jvm增大直到xmx最大
1、首先,如果-Xms起初值设置的比较小,那么就频繁触发GC操作。当GC操作无法释放更多内存时,会进行内存的扩充。
2、内存扩充的时候,会出现内存抖动的情况
【就比如我上街看到一个很喜欢的商品,想要买下这个商品,但是我身上的钱不够了, 于是我向你借钱,你同意了,然后你掏出钱包, 把钱拿出来,然后再交给我,你拿钱给我的这整个过程也是需要时间的。所以我为了省下这个拿钱的时间,我在一开始出门的时候就直接带上足够的钱,这样就可以省下借钱的时间了】
为对象分配内存TLAB
对象不一定全部分配在堆上,采用逃逸分析时,即对象只在方法体内使用时,也可以分配到栈中
一个java源文件中的类、接口,编译后产生一个字节码文件。而Java中的字节码需要数据支持,通常这种数据会很大以至于不能直接存到字节码里,换另一种方式,可以存到常量池,这个字节码包含了指向常量池的引用。
这部分内容在类加载后存放到方法区的运行时常量池中,其中每个已加载的类都会维护一个常量池,通过索引访问
【创建轮子,车架】我将我的java文件打包生成字节码文件,当我点击运行的时候,启动类会被主动加载,jvm的类加载器就会
【实例化四个轮子,车架】jvm开启线程,主动对启动类进行类的初始化:先进行类初始化,即将方法区/堆区的静态变量进行初始化,执行静态代码块,然后是对象初始化,new的对象放到jvm的堆中,执行赋值语句,普通代码块,最后是构造函数代码。
【组装】jvm在栈中开启一个栈帧记录线程,在运行时加载该方法的局部变量表,利用操作栈对数据进行循环,遍历运算,如果在执行过程中遇到了对象引用,那就去方法区的运行时常量池将符号转化为直接引用,执行完毕后,堆中的对象被清除。
当在多次minor GC后仍然存活的满足一定存活代数的对象,或者是由于太大无法在新生代中分配的对象
java8之前,两种模式
java8之后
为什么有这个变动呢?
行时常量池)放在本地内存上,叫元空间
为什么有这个变动呢?
更多【jvm-学习笔记4——JVM运行时数据区梳理】相关视频教程:www.yxfzedu.com