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部分配置详解