asp.net 做电子购物网站的网银结算功能如何实现的,猎头公司电话,微信小程序外联网站,网站登陆怎么做JVM内存划分 
JVM也就是java进程#xff0c;这个进程一旦跑起来就会从操作系统这里申请一大块内存空间#xff0c;JVM接下来就要进一步的对这个大的空间进行划分#xff0c;划分成不同区域#xff0c;从而每个区域都有不同的功能作用#xff0c;一共分为如下几个区域 1.堆…JVM内存划分 
JVM也就是java进程这个进程一旦跑起来就会从操作系统这里申请一大块内存空间JVM接下来就要进一步的对这个大的空间进行划分划分成不同区域从而每个区域都有不同的功能作用一共分为如下几个区域 1.堆heap整个内存区域中最大的区域放的就是代码中new出来的对象成员变量 
2.栈stackJVM虚拟机栈保存了java中的方法调用关系 
3.元数据区以前叫”方法区“从java 8 改名字放类对象的 
4.程序计数器是内存区域中最小的区域只需要保存当前要执行的下一条指令(JVM字节码)的地址(这个地址就是元数据区里面的一个地址) 
写一个伪代码大家来判断是那个区域的 在上述代码中a ,t2,s这三个都是Test的成员变量都是在堆上的 b是static修饰成了类属性就会出现在类对象中也就是元数据区 hello本体是在元数据区s自身实在堆上的里面保存了一共指向元数据区的地址 
在下面的main中t是代码中的”局部变量“局部变量是在栈上的而new Test()才是在堆上的t只是保存了堆上的地址 
画图理解 基本原则一个对象在哪个区域取决于对应变量的形态。 
1.局部变量栈上 
2.成员变量堆上 
3.静态成员变量方法区/元数据区 
类加载的过程 
我们正常写的java代码是 .java 文件 (硬盘)一个 java 进程要跑起来就需要把 .java 先变成 .class 文件 (硬盘)加载到内存中得到类对象。 
以下是类加载的几个环节八股内容 
1.加载在硬盘上找到对应的.class文件读取文件内容 
2.验证检查.class里的内容是否符合要求.class是javac编译器生成的.class文件的格式的格式在java的官方文档中是有明确定义的在验证过程中会把读取进来的内容往明确定义的格式里套能不能套进去看是否有问题 
3.准备给类对象分配内存空间内存空间会被分到元数据区而这个空间里的数据会先默认为0 
4.解析针对字符串常量来初试化把刚才.class文件中的常量的内容取出来放到”元数据区“ 
5.初试化针对类对象进行初试化注意这里不是针对对象初试化和构造方法无关而是给静态成员进行初试化执行静态代码块 
经过上述过程此时的类对象就敲定了后续代码就可以使用这个类对象创建实例或者使用里面的静态成员了。 
类加载中的”双亲委派模型“ 
双亲委派模型出现在上述类加载过程中的”加载“这一环节根据代码中写的”全限定类名“类名包名找到对应的.class文件 
双亲委派模型描述了 JVM 加载 .class 文件过程中找文件的过程 
类加载器 
在JVM中包含的一个特定的模块/类这个类负责完成后续的类加载工作在JVM中内置了三个类加载器负责加载不同的类分别是BootstrapClassLoaderExtentionClassLoaderApplicationClassLoader。 工作过程假设给定一个类的全限定类名  java123.Test(自己写的一个类) 
1.工作从 ApplicationClassLoader 开始进行ApplicationClassLoader 并不会立即搜索第三方库的相关目录而是把任务交给自己的父亲来进行处理。主打一个啃老 
2.工作就到了 ExtentionClassLoaderExtentionClassLoader 也不会立即搜索负责的扩展库的目录也是把任务交给自己的父亲来处理主打一个啃老double 
3.工作就到了 BootstrapClassLoaderBootstrapClassLoader 也想交给自己的父亲来处理但是它的 parent 指向 null 只能自己处理BootstrapClassLoader 尝试在标准库的路径中搜索上述类。如果这个类在标准库中找到了于是搜索过程就完成了类加载器负责打开文件读取文件等后续操作就行了.….. 如果没找到任务还是要继续还给儿子来处理~~ 
4.工作回到了 ExtentionClassLoader此时就要搜索扩展库对应的目录了如果找到了就由当前的类加载器负责打开文件读取文件等后续操作。如果没找到,任务还是要继续还给儿子来处理~~ 
5.工作回到了 ApplicationClassLoader此时要搜索第三方库/用户项目代码的目录了如果找到了也是由当前的类加载器负责处理如果没找到,任务还是要继续还给儿子来处理~~ 
此时, 没有儿子了还没找到就会最终抛出一个 ClassNotFoundException. 
总结拿到任务交给老爹老爹处理不了再自己处理 
注意此处的父子关系不是通过类的继承表示的(不是父类和子类)而是通过类加载器中存在一个parent 这样的字段指向自己的父亲。 
那么为什么这么麻烦捏不能直接自己处理吗 
上述过程主要是为了应对这个场景比如你自己代码里写了一个类类的名字和标准库/扩展库冲突了 会确保加载的类是标准库的类(就不加载你自己写的类了) 
有帮助理解麻烦点个赞