专栏首页java技术大本营JVM | OOP-Klass 二分模型

JVM | OOP-Klass 二分模型

小刀微信名换成了凑心, 头像换成了上面为武汉加油的,不要不认识了,,,,,

本文知识点

  • OOP和klass的概念
  • OOP和Klass源码
  • HSDB的使用

OOP和klass的概念

OOPS: 即普通对象指针,用来描述对象实例信息

Klass: Java类的C++对等体,用来描述Java类

总体上是多个OOP和一个Klass是对应的. 相当于一个类可以有多个实例

A a = new A() ; A a1 = new A();

a,a1 分别对应着不同的OOP, 对应着同一个Klass

OOP和Klass源码

OOP中有很多模块,

其中最常用的是

instanceOop , 表示一个java类型实例

oopsHierarchy: 描述了对象的表示层次,描述了klass的表示层次,并为OOPS指针oopDesc* 定义了别名

markOop: 表示对象头

Klass 中对应的是:

instanceKlass : 在虚拟机层面描述一个java类

OOP源码

首先看oopsHierarchy.hpp文件中,可以看到在OpenJDK的源码中都是用oopDesc* 等Desc* 来表示的.

在虚拟机内部,通过instanceOop 来表示一个java对象,对象在内存中的布局可以分为连续的两部分, instanceOopDesc 和实例数据

其中 instanceOopDesc中有:

friend class VMStructs;

friend class JVMCIVMStructs;

private:

// 看MarkOop的内容

volatile markOop _mark;

union _metadata {

// 看下面instanceKlass的内容

Klass* _klass;

narrowKlass _compressed_klass;

} _metadata;

MarkOop 对象头里面的东西

在markOopDesc中, 我们可以看到对32位和64位的对象头是分开定义的,

32位/64位的markOop中的格式如下图所示,对不同的对象,有不同的布局.

hash: 保存对象的哈希码

age: 保存对象的分代年龄

biased_lock: 偏向锁标识位

lock: 锁状态标识位

JavaThread*: 保存持有偏向锁的线程ID

epoch: 保存偏向时间戳

instanceKlass

klass: 元数据指针, 包含了实例对象所属类型的元数据, 虚拟机在运行时,会频繁到本地内存中去找类的描述信息(jdk1.8之后)

instanceKlass 继承于Klass,两者一起描述了类所共有的信息,如类名称

Klass中的主要字段

如上图所示,有类名称, 父类, 子类,类加载器等信息,即使没有C++语言基础,看到这些名字也能猜出来大致意思

instanceKlass 在原有klass的基础之上多了注解,常量信息,下面截图只是一部分,但是我把文件名还有行号都截出来了, 本文只做抛砖引玉之用,还需要大家下载源码,跟着一步步自己去学习!

HSDB

本文使用的都是jdk11, jdk8的启动方法网上一大堆,可自行百度.

HSDB是调试虚拟机极其有用的一款内置工具,自JDK9及以后,启动方式稍有些变化,首先确定自己的jdk版本,我现在的是11.0.2,如下:

启动方式是:jhsdb hsdb

输入jvm 进程号点OK 就可以看到jvm内部一些信息,如下图所示

总结

这篇以概念为主,记得在看《深入理解java虚拟机-jvm高级特性与最佳实践》这本书时,这些概念看一遍忘一遍, 还是要看源码, 这样印象才会深刻些, 大家加油!

本文分享自微信公众号 - java技术大本营(java-ideashare),作者:微笑的小小刀

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java练习本(2019-07-12)

    “ Love is our true destiny. We do not find the meaning Of life by ourselves alon...

    微笑的小小刀
  • JDK14中record实践尝鲜

    他来了他来了,不好意思, 他来晚了. 大家好, 我是小刀,前几天看到朋友圈被jdk14的GA版本刷屏了,我一直忍到现在才写,,,唉,实在是惭愧惭愧.

    微笑的小小刀
  • JVM | 阅读源码必备的C++技能

    通读源码之后,我们可以发现, 源码中大多是C和C++写的, 我相信读者大都是java程序员如果是一些if-else,while这些简单的控制流程语句应该是没问题...

    微笑的小小刀
  • 程序员内功心法【设计模式】之建造者模式

    建造者模式构建复杂对象就像造汽车一样,是一个一个组件一个一个步骤创建出来的,它允许用户通过制定的对象类型和内容来创建他们,但是用户并不需要知道这个复杂对象是如何...

    Java架构
  • 支付系列:微信支付前准备

    乱敲代码
  • SD-WAN 2.0:向更完整的解决方案迈进

    软件定义广域网(SD-WAN)目前是一个超级火热的话题,有着大量的企业用户的同时又是电信服务提供商的痛点。为什么呢? ✤ 对企业来说,SD-WAN提供了使用低...

    SDNLAB
  • 在寻找SD-WAN供应商之前,你应该考虑啥呢?

    SD-WAN支持各种垂直行业的用例,基本上任何拥有分布式机构的组织都可以从该技术中受益。

    SDNLAB
  • 洪泰智造工场&腾讯云创业加速营全球招募

    招募时间:2018年 1 月 22日-2018年 3 月 18日

    云加创业小助手
  • ONOS中Juniper路由器Driver开发简介

    简介 根据SDN的实现深度,可将其分为狭义SDN与广义SDN。其中,狭义SDN是指基于OpenFlow协议,将转发面和控制面完全分离的革命性SDN。广义SDN是...

    SDNLAB
  • 「大众点评点餐」小程序开发经验 05:解析开发工具

    周中坚,美团点评工程师,4年 Web 前端开发经验,主要负责过会员卡、外卖、预订、商家平台等业务的前端开发,现在是美团点评点餐团队的一员。

    知晓君

扫码关注云+社区

领取腾讯云代金券