JVM
星之守瞳映
这个作者很懒,什么都没留下…
展开
-
12.StringTable
String s1 = new String("abc");不会放入字符串常量池中String s2 = "abc";//会直接放入字符串常量池中,若本来就有,则指针指向其String s3 = s1.intern();System.out.println(s1 == s2);falseSystem.out.println(s3 == s1);falseSystem.out.println(s3 == s2);trueString s1 = "abc";String s2 = "abc";原创 2020-06-19 13:26:20 · 120 阅读 · 0 评论 -
11.执行引擎
原创 2020-06-19 13:24:21 · 126 阅读 · 0 评论 -
10.对象的实例化
接图:6.执行inti方法进行初始化对象访问方式主要有两种:句柄访问直接指针(Hotspot采用)原创 2020-06-15 20:22:17 · 101 阅读 · 0 评论 -
9.方法区
在jdk7及之前,习惯上把方法区称为永久代,jdk8之后,使用元空间取代了永久代。本质上,方法区和永久代并不等价。元空间的本质与永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代最大的区别在于:元空间不在虚拟机设置的内存中,而是使用本地内存。永久代元空间二者不只是名字变了,内存结构也调整了。JDK7: OOM(PermGen space)JDK8 : OOM(Metaspace)-XX:MetaspaceSize=10m-XX:MaxMetaspaceSize=10m原创 2020-06-15 20:20:44 · 96 阅读 · 0 评论 -
8.堆
-Xmx:最大堆大小-Xms:初始堆大小-Xmn:年轻代大小-XXSurvivorRatio:年轻代中Eden区与Survivor区的大小比值所有线程共享堆,但也可以划分线程私有的缓冲区。(TLAB)JDK7 : 新生代 老年代 永久代JDK8 : 新生代 老年代 元空间默认堆空间大小初始内存大小:物理电脑内存大小/64最大内存大小:物理电脑内存大小/4主动设置大小:Run -> Edit C…开发中建议将初始内存大小和最大内存大小设置为一样的值。查看设置的参数原创 2020-06-15 20:17:35 · 94 阅读 · 0 评论 -
7.本地方法
本地方法接口在讲Java虚拟机运行时数据区中本地方法栈之前,我们先来说说运行时数据区之外的一个叫本地方法接口的东西简称JNI(Java Native Interface)简单来讲,一个Native Method就是一个java调用非java代码的接口,一个Native Method 是这样一个java方法:该方法的底层实现由非Java语言实现,比如C。这个特征并非java特有,很多其他的编程语言都有这一机制,比如在C++ 中,你可以用extern “C” 告知C++ 编译器去调用一个C的函数。在定义转载 2020-06-15 20:12:08 · 294 阅读 · 0 评论 -
6.虚拟机栈——栈帧
栈帧的内部结构每个栈帧中存储着1.局部变量表(Local Variables)2.操作数栈(Operand Stack)(或表达式栈)3.动态链接(Dynamic Linking)(或执行"运行时常量池"的方法引用)----深入理解Java多态特性必读!!4.方法返回地址(Return Adress)(或方法正常退出或者异常退出的定义)5.一些附加信息其中部分参考书目上,称方法返回地址、动态链接、附加信息为帧数据区局部变量表(Local Variables)1.局部变量表也被称之为局部转载 2020-06-15 20:11:18 · 319 阅读 · 0 评论 -
5.虚拟机栈
虚拟机栈的背景由于跨平台性的设计,java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。根据栈设计的优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。内存中的堆与栈栈是运行时的单位,而堆是存储的单位1.栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放、放在哪儿。2.一般来讲,对象主要都是放在堆空间的,是运行时数据区比较大的一块3.栈空间存放 基本数据类型的局部变量,以及引用数据类转载 2020-06-15 20:10:29 · 95 阅读 · 0 评论 -
4.程序计数器
JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。一个线程对应一个 JVM Stack。JVM Stack 中包含一组 Stack Frame。当 JVM 调用一个 Java 方法时,它从对应类的类型信息中得到此方法的局部变量区和操作数栈的大小,并据此分配栈帧内存,然后压入 JVM 栈中。在活动线程中,只有位于转载 2020-06-15 20:09:12 · 412 阅读 · 0 评论 -
3.JVM运行时数据区划分
Java内存空间内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了JAVA在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的jvm对于内存的划分方式和管理机制存在着部分差异(对于Hotspot主要指方法区)(图源阿里)JDK8的元数据区+JIT编译产物 就是JDK8以前的方法区JavaAPI中的Runtimepublic class Runtimeextends ObjectEvery Java appl转载 2020-06-15 20:07:51 · 88 阅读 · 0 评论 -
2.类加载子系统
JVM细节版架构图本文针对Class Loader SubSystem这一块展开讲解类加载子系统的工作流程类加载子系统作用1.类加载子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识即16进制CA TE BA BE;2.加载后的Class类信息存放于一块成为方法区的内存空间。除了类信息之外,方法区还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)来一张经典的JVM内存结构图:其中类加载器的工作转载 2020-06-15 20:06:24 · 163 阅读 · 0 评论 -
1.简介
首先来看计算机系统当中JVM所处的位置JVM是运行在操作系统之上的,并没有和硬件有直接的交互Java一次编译,到处运行古今JVMSUN ClassicExact VMHotSpot VM :HotSpot指热点代码探测技术BEA JRockit:(BEA 已被Oracle收购) 专注于服务端应用,世界最快的jvm之一IBM J9Taobao JVM: 目前已经在淘宝、天猫上线,替换了Oracle官方JVM;Graal VM: Oracle 2018年4月公开,口号 Run Prog转载 2020-06-15 20:03:38 · 97 阅读 · 0 评论