HotSpot 虚拟机的对象头包括两部分信息:Mark Word(标记字段)和 Klass Pointer(类型指针)
1 Mark Word 用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等等。JVM 对象头一般占用两个机器码,在 32-bit JVM 上占用 64bit, 在 64-bit JVM 上占用 128bit 即 16 bytes(暂不考虑开启压缩指针的场景)。
另外,如果对象是一个 Java 数组,那在对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通 Java 对象的元数据信息确定 Java 对象的大小,但是从数组的元数据中无法确定数组的大小。
对象需要存储的运行时数据很多,其实已经超出了32、64位 Bitmap 结构所能记录的限度,但是对象头信息是与对象自身定义的数据无关的额外存储成本,考虑到虚拟机的空间效率,Mark Word 被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的信息,它会根据对象的状态复用自己的存储空间。
例如在 32 位的HotSpot 虚拟机中对象未被锁定的状态下,Mark Word 的 32个Bits 空间中的 25Bits 用于存储对象哈希码(HashCode),4Bits 用于存储对象分代年龄,2Bits 用于存储锁标志位,1Bit固定为0,在其他状态(轻量级锁定、重量级锁定、GC标记、可偏向)下对象的存储内容如下表所示。
专题推荐 网络编程 基础到进阶教程
一 通用头字段
Connection
这个字段只在>
SONP请求:xhrsetRequestHeader('x-my-custom-header', 'some value');
或者在请求bjsp前先请求一个中转页,专门根据参数设置header的中转页
public:权限修饰符,权限最大。
static:随着MianDemo类的加载而加载,消失而消失。
void: 没有返回值
main: 函数名,jvm识别的特殊函数名
(String[] args):定义了一个字符串数组参数
/
class MainDemo
{
public static void main(String[] args)
{
String[] arr = new String[]{"zhang","li","wang","zhao"};
MainTestmain(arr);
}
}
class MainTest
{
public static void main(String[] args)
{
for (int x=0; x<4; x++)
{
Systemoutprintln(args[x]);
}
}
}
/
1、运行java MainDemo时,提示越界,因为jvm传过来的是一个长度为0的数组,不存在有元素。
2、但是如果运行java MainDemo zhang li wang zhao 后,输出结果为zhang。
因为通过这个命令,就相当于jvm给main()函数传递了一个String[] args = new String[]{"zhang","li","wang","zhao"}的数组。
/
class MainDemo
{
public static void main(String[] args)
{
Systemoutprintln(argslength);
Systemoutprintln(args[0]);
}
}
/
当然是null啊。RequestContextHolder从ThreadLocal获取数据,在 请求过程中,MVC会将request和response放入ThreadLocal。你另起一个线程,框架没处理这些事。
看>
以上就是关于JVM对象头(header)全部的内容,包括:JVM对象头(header)、Java网络编程从入门到精通(23):HTTP消息头字段、一个java网络编程的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)