VM运行时数据区知识点
2022-03-04 16:29:07 102 举报
JVM运行时数据区知识点大全
作者其他创作
大纲/内容
youngGC只发生在新生代
JDK的类会优先使用BootStrapClassLoader进行加载
程序员自定义的String类无法被加载JDK源码不会被程序员污染
*以上数字均为JVM默认,可以根据具体场景修改,并非定值
类加载子系统
XxxxClassLoader自定义实现,供程序员拓展用
FullGC
survivor0幸存者0区幸存下来的对象被转移至此,年龄+1,如果年龄超过阈值则转移至老年代
判断两个类是否相同——除了类名包名一致以外,还需要使用同一个类加载器进行加载,这也是沙箱安全机制的原理
程序计数器——Program Counter Regiter记录程序运行到哪了
永久存储区有不同的实现:永久代、元空间——Java8的默认JVM实现,不在JVM内,位于本机的物理内存
栈帧——Frame
Eden满,触发youngGC
survivor0幸存者0区占1/30的堆空间
survivor0幸存者0区清空
Survivor1幸存者1区占1/30的堆空间
Eden Space伊甸园区清空
survivor0幸存者0区
栈——Java Stack
方法索引——Method Index
Survivor1幸存者1区没用的对象被回收。留下来的对象转移至此,年龄+1,如果年龄超过阈值则转移至老年代
方法区——Method Area(实现:元空间、永久代)存放类的结构信息、常量String s = \"xxx\"
一段时间后
BootstrapClassLoaderC++,实现用于加载JDK的类
栈帧
2. 复制算法
Tenure Generation Space老年代占2/3的堆空间默认新生代的对象年龄到达15岁(最大值)就会被转移到老年代
堆——Heap存放对象会出现OutOfMenryError-Xms1024m开始大小,默认为本机内存的1/64-Xmx1024m最大大小,默认为本机内存的1/4一般最大最小设为同值——以防止内存波动
1. 标记清除算法:如果老年代满了,标记没有用的对象,清除
沙箱安全机制
执行引擎——Execution Engine负责将字节码指令解释/编译为对应平台上的本地机器指令
GC算法
...
堆——heap
本地方法接口——Native Interface
当需要加载一个类时,优先使用父类加载器,如果无法加载则交给子类加载去加载
Eden Space伊甸园区满了!!!!
输入输出参数——Parameters
Eden Space伊甸园区占8/30的堆空间所有新创建的对象都在这里
使用同一个包名类名的两个类因为类加载器不同会被认为是不同的类
类信息——Class File
2. 标记整理算法:清除对象导致内存碎片,整理腾出连续的内存空间
新生代
Runtime Data Area(运行时数据区)
本地方法库
1. 引用计数法——无法解决循环引用,改进:设定一个根节点,与根节点不连通的都可以GC
ExtensionClassLoaderJava实现,用于加载javax包下的类
双亲委派模型
Java栈——Java Stack一个方法对应一个栈帧存放对象的引用(方法的输入、输出、局部变量)和八种基本数据类型会出现StackOverFlowError管线程的运行顺序
Person p = new Person()
Survivor1幸存者1区清空
父帧——Return Frame子帧——Next Frame
Survivor1幸存者1区
本地方法栈——Native Method StackJDK中的native方法就在此栈中控制执行(JDK中的方法并非只有Java一种语言实现)由于当下的异构系统基本上都使用微服务进行远程过程调用,所以很少用本地方法实现异构系统——根据“对外Restful,对内RPC”的原则进行异构系统的方法调用
线程独占区
线程共享区
局部变量——Local vars
0 条评论
下一页