JVM
文章平均质量分 62
java虚拟机原理,jvm性能调优
death bell
这个作者很懒,什么都没留下…
展开
-
JVM-对象在内存上的分配
test1类是return user ,user可能还存在外部引用,这种的对象不会随着方法调用结束,随着栈帧一起被销毁,可以逃出当前的作用域,称之为内存逃逸。如果栈帧没有一块连续的空间足以存放当前对象,此时会有标量替换的机制,将对象成员变量分解存储在栈帧或者寄存器之上。标量替换是基于逃逸分析条件下才会生效的,一般标量替换参数和逃逸分析参数都要同时开启。编码中一般要减少产生内存逃逸的编码,减少堆的压力,也就是减少gc。关闭逃逸分析的时候,对象都会存储在堆上,gc次数明显上升。原创 2024-02-11 23:02:09 · 308 阅读 · 1 评论 -
JVM-对象创建过程
初始化指的是:例如a=12 ,实际上jvm初始化的时候 会先给a初始化一个0的值,后面在init方法赋值具体的数值分配内存机制:1.指针碰撞机制(默认机制):如果java堆的内存的空间是绝对规整的,就维护一个内存指针作为分界点,新分配对象空间就挪动指针。原创 2024-02-11 20:09:37 · 322 阅读 · 1 评论 -
JVM参数设置
XX:MetaspaceSize :元空间触发full gc的初始阈值,默认是21M,如果回收之后 ,大量空间被回收,会适当缩减该阈值,如果很少空间被回收,则适当扩张该阈值。所以一般建议给-XX:MetaspaceSize 和 -XX:MaxMetaspaceSize一样的初始值,减少full gc。3.方法区:-XX:MetaspaceSize 和 -XX:MaxMetaspaceSize。-Xss越小,则每个线程可分配的栈大小越小,则系统可以同时开启的线程数越多。2.堆:Xms Xmx。原创 2024-02-11 11:17:16 · 345 阅读 · 1 评论 -
JVM内存模型概述以及内存分配机制(附代码验证)
1.类装载子系统:负责将class文件加载到JVM虚拟机内存中2.字节码执行引擎3.堆:基本创建的对象实例都会在这里分配内存,所有线程可以共享的区域,一般方法区或者栈帧的变量都会存储对应在堆的指针4.栈:又成栈帧,每开启一个线程,JVM就会分配一个栈帧区域5.本地方法栈:JVM内存很多是C++实现的,该内存空间是专门分配给C++本地方法的6.程序计数器:每个线程都有,用于记录当前线程执行字节码的地址。原创 2024-02-10 23:24:44 · 374 阅读 · 1 评论 -
JVM-类加载运行全过程概述
1.编写完整个项目Java代码启动2.windows系统下的java.exe(C++编写实现)调用jvm.dll(C++实现,C++的库函数)创建一个JVM虚拟机3.C++程序创建一个引导类加载器实例4.C++继续调用java代码,创建JVM启动器,实例是com.misc.Launcher,该类会继续创建其他的类加载器。5.loadClass调用我们自己编写的类6.C++调用我们的java代码里面的main函数。原创 2024-02-09 21:26:12 · 292 阅读 · 1 评论 -
JVM-双亲委派机制详解以及实例代码验证
2.虽然parent方法依次从应用类加载器指向引导类加载器,但是他们并不是父子继承关系,只是方法调用关系,接下来会深入源码剖析。1.可以看到应用类加载器加载的范围,包括了扩展类加载器和引导类加载器,但是实际他只会加载当前的项目的jar运行项目下面的类。扩展类加载器可以自行下钻对应的方法,这里展示下钻最后一步,最后传入的变量为null,因引导类加载器为C++实现。最后定位到 parent只是一个成员变量,故解答了,应用类加载器和扩展类加载器是调用关系,而不是继承关系。全局搜索到Laucher类。原创 2024-02-08 10:31:36 · 497 阅读 · 0 评论