java虚拟机,从软件层面屏蔽了不同操作系统在底层硬件与指令的区别
使得java语言跨平台,一次编译,处处执行,不同类型的JDK包含不同的JVM
堆: 存放new 出来的对象,多个线程共享,栈里面的变量结果很多是对象,而对象在堆中,存的是地址,也就是指针由栈指向堆,栈和堆,方法区和堆都是指针的关系
线程栈: 用来存放变量(临时变量,局部变量)是由一个一个栈帧组成的,一个方法对应一个栈帧内存区域,能够实现变量隔离;栈数据结构特点是FILO先进后出,与方法的调用相吻合
本地方法栈: 用native修饰的,相当于一个未实现的接口,底层调用C++代码执行,而本地方法执行所需要的内存空间则放在本地方法栈中
方法区: 也成为元空间,存放常量,静态变量,类信息,多个线程共享
程序计数器: 存放下一个要执行的代码在方法区的地址,java运行是多线程,cpu的时间片被抢占去了,此线程会被挂起,当恢复时,可以根据此程序计数器记录的线程执行的地址继续执行下去
类装载子系统: 负责从文件系统或者网络上加载class文件
字节码执行引擎: 在执行程序过程中动态修改程序计数器的值
若windows系统下cmd打开输入命令找不到就需要自己下载安装
1.安装下载地址:jvisualvm下载地址
2.配置jdk路径,否则会检测不到java程序(在jvisualvm安装目录下的etc的visualvm.conf文件内,配置visual_jdkhome=本地的jdk路径)
3.安装完成后,安装Visual GC插件(Tools->Plugins->搜索Visual GC)
4.安装成功后运行程序效果
java ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐jar app.jar
标准化参数(输出结果稳定,不会随jvm的版本变动而变化):如java -version 或 java-help
非准化参数:如-X或这-XX
堆内存的设置:
-Xms:memory start
-Xmx:memory max
-Xmn:memory new
栈内存设置:
-Xss:stack size
元空间(方法区内存设置):
-XX:MaxMetaspaceSize:只受制于本地内存的大小
-XX:MetaspaceSize:不设置的话默认21M,会自动收缩,一般还是手动设置,因为达到默认值就会不断启动full gc导致程序启动非常慢
容量单位:bit —8—>B----1024------> KB----1024------> MB----1024------> GB----1024------> TB
例子:本地测试栈内存设置(128k和1M)
设置栈内存128k:‐Xss128k
程序运行结果:嵌套调用方法2532次
设置栈内存1M:‐Xss1M
程序运行结果:嵌套调用方法25439次