Car c=new Car()
能否解释一下上面代码在内存中是如何分配的?
在JVM栈区当中的一个新生代区里面的一个伊甸园区
java源程序(a.java)->编译成java的二进制字节码(a.class)
(1) Windows下的JAVA字节码解释程序
(2)Linux下的java字节码解释程序
(3)能直接解释java字节码的cpu
class files-> class loader-> | runtime data area (method area,java stack,native method stack ,heap,program counter register)|->execution engine->native-interface -native libraries
一、能否介绍一下JVM 的体系结构:
JVM体系结构:字节码文件-有类加载器加载 ,通过类加载器加载过来之后交给运行时空间(运行时空间里面凤城好多块:首先有一个方法区,2,有一个堆区,3还有一个java栈区,本地方法栈区,PC寄存器)-执行引擎-调用本地接口-libraries资源库
二、能否介绍一下类加载器:应用加载器,根加载器,扩展加载器(Class.forName("com.gao.Hello"))
classload 分为三个类加载器 :1.根加载器(bootstrap)2.(应用加载器 AppClassLoader)
3.(扩展加载器,ExtClassLoader)
类加载器 ClassLoader
负责加载class文件,class文件在文件开头有特定的文件提示,并且CLassLoader只负责class文件的的加载,至于是否可以运行,则有Execution Engine负责
JVM 中双亲委派机制;
java中的沙箱模型
三、JNI(java native interface) 由于java不能直接去访问底层(操作系统),所以要是用JNI去操作或者访问底层,JNI换句话说就是访问java 和操作系统之间的桥梁
四、栈:存放的都是基本数据类型,和一些引用类型
五、方法区:方法区是线程共享的,通常用来保存状态类的原结构信息。
eg:运行时常量池,静态变量 常量,字段,方法字节码,在类、实例、接口初始化用到的特殊方法等,
五、Heap堆
1.堆体系结构概述
一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的,类加载器读取了类文件后,需要把类、方法、常量、变量,放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行
堆分为三大区:
1:新生代区:
(1):eden区(伊甸园):当一个对象被第一次new出来的时候会放到新生代区的伊甸园区
(2):S0区(space):幸存区:当伊甸园区的内存满了的话;被new出来的对象就会放到幸存区中;
(3):S1区
2:老生区(养老区):如果新生代区都放不下的时候再往养老区放
3:永久区(持久带) jdk1.8 之后改名为元空间
六、堆内存的调优
1.常用调优参数列表
主要熟悉的是总存储空间大小、各个区的比例设置,针对不同的区设定不同的回收器和回收算法,在默认情况下有些选项是不打开的,因此需要手动配置,并且根据自己应用的情况选择适当的参数。
-Xms 设置初始分配大小,默认为物理内存的1/64
-Xmx 最大分配内存,默认为物理内存的1/4
java虚拟机的原理
猜你喜欢
转载自blog.csdn.net/qq_39879632/article/details/82708340
今日推荐
周排行