当前位置: 首页 > news >正文

清远市企业网站seo联系方式/关键词优化步骤简短

清远市企业网站seo联系方式,关键词优化步骤简短,安徽省住房和城乡建设厅官方网站,网站大全正能量免费2020JVM对象访问解析 对象访问过程的内存情况 ?123public void function(){Object obj = new Object();}function方法被执行的时候,JVM在JVM栈中为function创建一个栈帧,用于存放function在运行过程中的一些信息。 Object obj被执行时&#xff0…

JVM对象访问解析

对象访问过程的内存情况
?
1
2
3
public void function(){
    Object obj = new Object();
}

function方法被执行的时候,JVM在JVM栈中为function创建一个栈帧,用于存放function在运行过程中的一些信息。
Object obj被执行时,JVM在function方法对应的栈帧中的本地变量表中创建Object类型的引用obj。
new Object()被执行时,JVM在堆内存中创建一块Object类型的、包含实例数据值的结构化内存。
PS:不同的类型所对应的这块结构化内存的长度是不一样的。

对象访问的方式
不同的虚拟机的对象访问方式有所不同,主流的访问方式有两种:使用句柄间接访问实例数据、指针直接访问实例数据。

a)指针直接访问实例数据
在这种方式中,JVM栈中的栈帧中的本地变量表中所存储的引用地址就是实例数据的地址。通过这个引用就能直接获取到实例数据的地址。
除此之外,其实引用所指向的对内存中的对象数据有两部分组成,一部分就是这个对象实例本身,另一部分是对象类型在方法区中的地址。

b)使用句柄间接访问实例数据
JVM会在堆中划分一块内存来作为句柄池,JVM栈中的栈帧中的本地变量表中所存储的引用地址是这个对象所对应的句柄地址,而非对象本身的地址。句柄池中的一个个对象地址有两部分组成,一部分就是对象数据在堆内存中实例池中的地址,另一部分就是对象类型在方法区中的地址。

综上所述:句柄池就相当于一个中转站,我们要查询的实例对象数据需要通过一次间接索引获取;而指针的直接访问无需中转站,引用指向的就是要访问的实例对象数据。

此外,不管是哪种对象的访问方式,引用所指向的堆内存中的数据都是有两部分组成,其中有一部分一定是一个指向方法区中的对象类型的指针。

两种对象访问方式的好处
a)句柄访问对象的好处
访问对象通过一个句柄指针一次间接索引之后,当对象实例数据被移动的时候(垃圾回收的时候有些对象会被移动),只需要改变句柄池中该对象实例的地址即可,无需改变引用和句柄池的对应关系,所以引用中存储的是稳定的句柄地址。

b)指针直接访问对象的好处
这种方式最大的好处就是访问对象的速度很快,比通过句柄访问对象节约了一半的寻址时间,由于Java中对象的访问非常频繁,所以这种方式能节约很多寻址时间。

OOM异常解析

堆内存的OOM异常
a)如何产生?
堆内存用于存储实例对象,当我们不断创建对象,并且对象都有引用指向(GC Roots到对象之间有可达路径),那么垃圾回收机制就不会清理这些对象,当对象多到挤满堆内存的上限后,就产生OOM异常。

b)模拟堆内存OOM异常
PS:在eclipse的Arguments中可以设置VM arguments,这就是JVM的一些参数。
-Xms:设置堆的最小值
-Xmx:设置堆的最大值

?
1
2
3
4
5
6
7
8
9
public class A(){
    public static void main(String[] args){
        while(true){
            new Person();
        }
    }
}
//运行结果中出现:java.lang.OutOFMemory:Java heap space
//说明是在堆内存中发生了OOM异常。


c)如何解决?
使用内存映像分析工具:Eclipse Memory Analyzer对dump出来的堆转储快照进行分析,重点是确认内存中的对象是否是必要的,即要搞明白是内存泄漏还是内存溢出。
PS:内存泄漏导致的OOM:new出来的很多对象已经不需要了,但仍然有引用指向,所以垃圾回收机制无法回收。
PS:内存溢出:new出来的对象都是需要的,但堆内存太小装不下了。
如果是内存泄漏,通过工具查看泄漏对象到GC Roots的引用链。找到泄漏对象是通过怎样的路径与GC Roots发生关联,然后导致垃圾回收机制无法自动回收的。
如果不存在内存泄漏,也就是所有的对象都必须存在,这时候就调大堆内存。

JVM栈和本地方法栈的OOM异常
a)StackOverFlowError
当线程请求的栈深度大于虚拟机所允许的最大栈深度,就会抛出这个异常。
b)OutOfMemeoryError
当虚拟机要扩展栈时无法申请到足够空间的内存,就会抛出这个异常。
PS:这两种异常其实是对同一个问题的两种描述。在单一线程下,不论是栈帧太大还是虚拟机栈容量太小,当内存无法分配的时候,虚拟机抛出的都是StackOverFlowError。通过测试发现,如果给每个线程的JVM栈分配的内存越大,大的栈帧在这个JVM栈中也能装得下,理应StackOverFlowError会减少,但事实却恰恰相反:当每个线程的JVM栈越大,那么所能创建的线程数就越少,稍微建立几个线程可能就会把有限的内存资源耗尽。

运行时常量池的OOM异常
我们通过String类的intern()方法向方法区中的常量池添加内容。
intern方法的作用是:当常量池中已经有这个String类型所对应的字符串的话,就返回这个字符串的引用;如果常量池中没有这个字符串的话就将这个字符串添加到常量池中,再返回这个字符串的引用。

方法区的OOM异常
a)如何产生?
方法区中存放的是Class的相关信息,如:类名、访问修饰符、常量池、字段描述、方法描述等。
如果产生大量的类就有可能将方法区填满,从而产生方法区的OOM异常。

b)注意点
方法区的OOM异常是非常常见的,特别是在一些动态生成大量Class的应用中(JSP),需要特别注意类的回收。

本机直接内存的OOM异常

http://www.lbrq.cn/news/1596169.html

相关文章:

  • 做教育网站销售的好吗/游戏推广文案
  • 有没有做底单的网站/网络优化工程师
  • 上海建站模板网站/实训百度搜索引擎的总结
  • 兼职做ps网站/seo外链论坛
  • 个体做外贸的网站/上海网站排名seo公司
  • 网站制作公司承担/爱站网备案查询
  • 常州 网站建设/百度售后服务电话
  • 什么是网络营销信息/seo百度站长工具
  • 图书馆网站的建设的重要性/b站软件推广大全
  • 四川省建设厅注册管理中心网站/中国北京出啥大事了
  • 室内设计心得体会800字/名优网站关键词优化
  • 知名的wordpress模板/百度权重优化软件
  • 网上兼职做网站/百度seo营销推广多少钱
  • linux wordpress 建站教程/小程序开发文档
  • 上海市建设教育网站/抖音搜索关键词排名查询
  • 网页创建站点/百度网站关键词优化
  • 去西安旅游最佳路线/南京seo关键词排名
  • 可以做词云的网站/推广链接让别人点击
  • 专业的扬州网站建设/营销推广是什么
  • 北京海岸设计公司网站/网店运营推广登录入口
  • 网站制作应该注意到的问题/精准营销的概念
  • 重庆专业建网站/电子商务网站推广
  • 有没有做装修的大型网站而不是平台/南京疫情最新情况
  • 网站源码程序修改/软文营销方法有哪些
  • 怎样创建个人购物网站/百度竞价排名费用
  • 博客论坛网站开发/电商运营是做什么的
  • 三杰网站建设/合肥头条今日头条新闻最新消息
  • 福州做网站的公司电话/学历提升
  • 微信营销和网站建设/关于校园推广的软文
  • 做电子外贸网站建设/网站排名优化培训电话
  • 查看部署在K8S服务的资源使用情况
  • Redis内存耗尽时的应对策略
  • 【Spring】SpringBoot 自动配置,@ComponentScan、@Import、ImportSelector接口
  • LeetCode 132:分割回文串 II
  • Petalinux快捷下载
  • 随笔之 ClickHouse 列式分析数据库安装注意事项及基准测试