热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

通俗讲解JVM(三)

java冷知识:spring的版权被控制在vmware手里,其实spring的那一大堆东西,本质上是一个非标准的jee实现,

 java冷知识:spring的版权被控制在vmware手里,其实spring的那一大堆东西,本质上是一个非标准的jee实现,比如在jee里面用的inject,在spring里面就是autowire,当然spring曾经深刻滴影响了jee,所以有些东西比如di标准,是spring影响下制定出来的,所以spring的做法会比较特例一点。



1.直接内存


1.1Direct Memory

程序在运行时,不可避免的会访问系统内存,让我们来看一下jvm是如何帮我们进行处理的。

在jdk1.4中新加入了NIO类,引入了一种基于通道与缓存区的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,避免了在java堆和Native堆中来回复制数据。

操作系统的内存特点


  • 常见于NIO操作,用于数据缓冲区

  • 分配回收成本较高,但读写性能高

  • 不受JVM内存回收管理

  • 必须主动释放资源(ByteBuffer内部自动给我们调用了)

java并不能直接操作系统内存,而是通过cpu内部的系统将磁盘信息读取到系统的缓存区,然后提供给java缓存区,由java调用。需要将缓存复制一遍。

 分配的直接内存,操作系统和java都可以直接访问,减少了数据的访问时间和空间


 1.2分配与回收原理


  1. 使用了Unsafe对象完成直接内存分配回收,并且回收需要主动调用freeMemory 方法

  2. ByteBuffer的实现类内部,使用了Cleaner(虚引用)来检测ByteBuffer对象,一旦ByteBuffer对象被垃圾回收,那么就会由RefernceHandler线程通过Cleaner的clean方法调用freeMemory来释放直接内存

java中分配直接内存的方法(调用unsafe对象)


  • allocateMemory 返回分配内存的地址

  • setMemory

释放内存的方法(借助cleaner(虚引用类型),调用unsafe对象)


  • freeMemory 释放分配的内存


 1.3OutOfMemoryError异常

本机直接内存的分配不受java堆大小的限制,但是,既然是内存,肯定还是回受本机总内存大小以及处理器寻址空间的限制。服务器管理员在配置虚拟机参数时,会根据实际内存设置-Xmx等参数信息,但经常忽略直接内存,使得各个内存区域总和大于物理内存限制,从而导致动态扩展时候回出现OutOfMemoryError异常。


2.对象的创建

对象是如何创建的呢?当我们去new一个对象的时候,虚拟机接收到new指令,会先去检查这个指令的参数是否在常量池中定位到一个类的符号引用,并检查符号引用代表的类是否已经被加载、解析和初始化,如果没有,则需要先加载。


2.1内存的分配方式

加载完之后,便是内存的分配,对象所需要的内存在类加载完成后便可完全确定。这里介绍两种分配方式

第一种:指针碰撞

指针碰撞看起来不是很好理解,其实很简单。一块完整的内存,所有已经分配的内存在一起,空闲的内存放在一起。当需要分配空间的时候,就将指针向空闲内存移动分配的空间大小。

第二种:空闲列表

顾名思义,空闲列表就是记录内些空闲区域的列表。java堆内存并不能保证已分配的内存和未分配的内存完全分开,所以用指针碰撞难以实现内存的分配。而空闲列表则会记录空闲的内存区域,当需要分配内存时,便到列表中找到一块足够的空间,并修改列表中的内容。

选用哪种分配方式,这由java堆是否工整决定的。


2.2线程问题

以上两种情况处理单线程时没有问题,但是当出现多线程时会出现这么一个问题。

当A线程正在给a分配内存,指针还未移动时,这时B线程给b分配内存,记录的指针初始位置与未分配a对象时的位置相同。

两种解决方案:

第一种:原子性,对内存分配空间进行同步处理。

第二种:为每一个线程分配“私有“的内存空间,这里的私有并不是广义上的私有 ,它还是分配的堆内存,只不过是将堆分配成多个空间,每一个线程占有一块空间,这里的私有空间我们称它为本地线程分配缓冲(TLAB)。只有当这块区域用完时,才会进行同步锁定。

是否使用TLAB可以通过-XX:+/-UseTLAB参数来设定。

内存分配完成后,会将分配的内存空间初始化为零(不包括对象头),这样在使用时,即使不赋值也可以直接使用。

对象头中还存有很多信息,比如这是哪个类的对象实例,如何找到元数据信息、对象的哈希码、对象的GC分带年龄等。

接下来便会执行方法,将对象初始化。


之前跟着黑马的老师刷过一遍jvm,讲的真的非常棒,可以结合这PDF和课程一起刷

学习视频链接:

黑马程序员JVM完整教程,全网超高评价,全程干货不拖沓_哔哩哔哩_bilibili



深入理解JVM网盘链接
链接:https://pan.baidu.com/s/1iiMsS3vBWbLOxXstE1EpEw 
提取码:spoi



推荐阅读
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • PRML读书会第十四章 Combining Models(committees,Boosting,AdaBoost,决策树,条件混合模型)...
    主讲人网神(新浪微博:豆角茄子麻酱凉面)网神(66707180)18:57:18大家好,今天我们讲一下第14章combiningmodel ... [详细]
  • 3年半巨亏242亿!商汤高估了深度学习,下错了棋?
    转自:新智元三年半研发开支近70亿,累计亏损242亿。AI这门生意好像越来越不好做了。近日,商汤科技已向港交所递交IPO申请。招股书显示& ... [详细]
  • 电脑f5键是什么作用
    常见问题f5常见问题韩亚整形医院源码,vscode写前端代码,ubuntu低配,tomcat下载路径乱码,爬虫_gscu,php精粹pdf,广州快速seo优化排名,aspwap网站 ... [详细]
  • RN即ReactNative基于React框架针对移动端的跨平台框架,在学习RN前建议最好熟悉下html,css,js,当然如果比较急,那就直接上手吧,毕竟用学习前面基础的时间,R ... [详细]
author-avatar
虚线老母阳
推荐一首歌《春风十里》,我的个人订阅号:虚线老母阳
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有