初步了解jvm

1:jvm是什么
计算机:有处理器(cpu),存储(硬盘),内存,这些重要组成,也承担了计算机的相关工作,那虚拟机是如何实现的,相关工作的,首先计算功能应该是交给操作系统完成的,
jvm虚拟机:指令集,寄存器,栈,堆,方法区,本地方法栈
指令集是用来和操作系统互动
栈是程序执行的发生过程控制
寄存器存储程序执行的状态,例如线程阻塞停止下来
方法区是栈中指针的指引,是程序方法体的存在地
本地方法栈,是执行java 本地程序的地方,java是c++编写,这里的方法可能是c++代码

2:java是一个对象编程语言,那java 的这个对象是什么样的对象
java 是c++编写的,而c++也是门面向 对象的编程的语言,那c++的对象长什么样子?

class Box {
public: double length; // 长度
 double breadth; // 宽度
double height; // 高度
 // 成员函数声明 
double get(void); 
void set( double len, double bre, double hei );
 };

是的java的类也很像c++的类,
由c++编写的java类是Oop-Kclass模型
oop: Ordinary Object Pointer 普通对象指针

Class a = new ClassA()
当加载到这里的时候 jvm会加载classA到perm区,jvm同时会创建一个instanceKlass,它包含了classA中的所有信息,变量,方法,接口,函数等,instanceOop这个普通对象指针指向它,加载到classA的时候就会创建出instanceOop,jvm就能通过instanceOop获取到instanceKlass的信息。
oop
_bs:用户内存屏障
metadata:联合结构体---用于标记元数据地址,,,,java反射就是通过这里找到元数据结构信息
   wideKlassOop:宽指针
   narrowOop:压缩指针
mark  :用于标记类的状态
线程状态 、并发锁 、GC 分代信息


Oop-Klass  模型的三个表达
实例数据视图
原信息视图
虚函数列表


klass主要描述 Java 类和 JVM内部C++类型的元信息和虚函数,这些元信息的实际值就保存在oop里面
(为什么要分开  为什么不能设计 oop 和class在一起)


handle  ---   Oop   ----Klass

oop:
   mark:哈希码,gc分带年龄,锁标志,线程持有锁,偏向线程id,时间戳

 ,metadata ,tags  .....
oop体系
Hotspot里的oop 其实就是 GC 所托管的指针,所有oopDesc及其子类( 除神奇的 markOopDesc 外 ) 的实例都由 GC 所管理

klass体系
©klass提供一个与 Java 类对等的 C++类型描述。
©klass提供虚拟机内部的函数分发机制 。

1.vtable虚函数表
vtable中存放 Java 类中非静态和非 private 的方法入口,JVM调用 Java 类的方法 (非静态和非 private)时,最终会访问vtable,找到对应的方法入口。
2.itable 接口函数表
itable中存放 Java 类所实现的接口类方法。同样,JVM调用接口方法时,最终会访问itable,找到对应的接口方法入口。

vtable和itable 里面存放的并不是Java类方法和接口方法的直接入口,而是指向了 Method 对象入口,JVM会通过Method最终拿到真正的 Java 类方法入口

静态的对象将存在永久代或者元数据区,但new出来的静态方法 数据会出现在 堆中

栈
操作数栈,动态连接,方法出口,记录了一个方法从调用到执行完,局部变量表存在栈中:八种基本数据
堆:
新生代,老年代,线程线程共享,
``

`

```java
方法区:
线程共享,类信息,常量,静态变量,
也会有内存溢出问题

永久区会进行gc吗
会,在永久区即将满了之后,并且会进行扩容,如果设置了
永久区对象回收的条件:
常量:没有任何任何地方引用
对象:该类所有实例已被回收,该类的classLoader被回收,没有任何地方通过反射访问该类

使用Java 8以后,关于元空间的JVM参数有两个:-XX:MetaspaceSize=N和-XX:MaxMetaspaceSize=N,对于64位JVM来说,元空间的默认初始大小是20.75MB,默认的元空间的最大值是无限。MaxMetaspaceSize用于设置metaspace区域的最大值,这个值可以通过mxbean中的MemoryPoolBean获取到,如果这个参数没有设置,那么就是通过mxbean拿到的最大值是-1,表示无穷大。

由于调整元空间的大小需要Full GC,这是非常昂贵的操作,如果应用在启动的时候发生大量Full GC,通常都是由于永久代或元空间发生了大小调整,基于这种情况,一般建议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值,并设置得比初始值要大,对于8G物理内存的机器来说,一般我会将这两个值都设置为256M

hsdb使用:
查看运行时 新生代 老年代 永久代情况
查找系统中的某一个类,并查看存活情况
找到某一个变量的地址
https://blog.csdn.net/hu10131013/article/details/107720773

jvm部分配置详解
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值