JVM
文章平均质量分 72
快来和我一起学习JVM
从未止步..
努力努力再努力!
展开
-
值类型相关函数与对象类型相关函数内存调用过程
当add函数执行完毕,左侧栈所占用的内存就会被释放掉,但是右边堆所占用的内存并不会被随着函数调用结束而清空,因为我们无法确定是否还有其他的线程也引用堆中的对象,而需要使用。答案是20和10,如果你猜对了请先不要窃喜,不妨继续往下看,检测一下自己是真的会还是仅仅猜对了。Java的基础数据类型都是值类型,指针也是值类型,因而是直接存到内存,不是存地址去寻址。先来看这样一段代码,你认为它的运行结果是多少呢?因此最终输出的a的值其实是main函数中的a的值。20和11还是20和10?原创 2023-12-12 17:13:40 · 560 阅读 · 1 评论 -
JVM之堆和GC垃圾回收
Eden 与Survivor Space 的空间大小比例默认为8:1,即当Young/New Generation 区域的空间大小总数为10M 时,Eden 的空间大小为8M,两块Survivor Space 则各分配1M,这个比例可以通过-XX:SurvivorRatio 参数来修改,Young/New Generation的大小则可以通过-Xmn参数来指定。一个启动类,加载了大量的第三方jar包,Tomcat部署了太多的应用,大量生成的反射类,不断地被加载,直到内存满,就会出现OOM。原创 2022-12-19 21:34:18 · 308 阅读 · 1 评论 -
JVM-------栈
早在数据结构的学习中,我们就知道了栈具有先进先出的特点,而数据结构是程序的一部分,那么栈的特点在java中是如何体现的呢?当方法执行完毕后,又会被弹出栈,b—>a---->main的顺序弹出栈,当栈为空时,即代表程序运行结束,这也就是为什么main方法先执行而后结束的原因。接着执行print()方法的调用,将print()压入栈中,当方法体print()被调用完成后,就会立刻马上从栈内弹出,最后,上述实例中,我们的调用次数是很少的,所以不会存在栈溢出这种情况!原创 2022-12-19 19:42:21 · 512 阅读 · 0 评论 -
JVM之native关键字与PC寄存器
本地方法和其它方法不一样,本地方法意味着和平台有关,因此使用了native的程序可移植性都不太高,另外native方法在JVM中运行时数据区也和其它方法不一样,它有专门的。原创 2022-12-18 16:14:19 · 368 阅读 · 0 评论 -
java之JVM的位置和体系结构
Java虚拟机栈是Java方法执行的内存模型,每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。,如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出 OutOfMemoryError 异常。:存储局部变量表,操作数栈,动态链接,方法出口等信息,随着方法的调用而创建,随着方法的结束而销毁。Java运行时内存区有Java堆,方法区,程序计数器,虚拟机栈,本地方法栈这五个地方,其中。,而jre包含jvm,但jvm并不是java语言编写的,它是由C/C++开发的。原创 2022-12-17 19:26:48 · 597 阅读 · 0 评论 -
java------沙箱安全机制
虚拟机会把所有代码加载到不同的系统域和应用域,系统域部分专门负责与关键资源交互,而各个应用域部分则通过系统域的部分代理来对各种需要的资源进行访问,虚拟机中不同的受保护域,对应不一样的权限,存在于不同域中的类文件就具有了当前的全部权限。在java中将执行程序分为本地代码和远程代码两种,本地代码默认视为可信任的,而远程代码则被看做是不受信任的,对于授信的本地代码,可以访问一切本地资源,而。但如此严格的安全机制也给程序的功能拓展带来障碍,比如:当前用户希望远程代码访问本地系统的文件时,就无法实现,因此在后续的。原创 2022-12-18 14:30:16 · 1325 阅读 · 0 评论 -
java------JVM之类加载和双亲委派机制
以上报错的行为就与我们上文介绍的双亲委派机制有关,我们的定义的任何类都不是直接加载的,需要层层委托,直到启动类(根)加载器,由根加载器判断该类是否被加载过,很明显String类存在于JDK中,他已经被加载过了,因此,我们所定义的String并不会被加载,这样是防止jvm被修改,也是为了程序安全。将新建的对象放入堆里面,而对象的引用(地址)放到栈,其中引用指向堆里面对应的对象。,加载扩展库,如classpath中的jre ,javax.*或者。java.ext.dir 指定位置中的类,原创 2022-12-18 12:24:22 · 441 阅读 · 0 评论