内存碎片

Java填坑工程--JVM那些事儿之垃圾收集器

不问归期 提交于 2019-12-15 19:48:01
文章目录 一、垃圾收集器 1、对象是否存活? 2、垃圾收集算法 标记-清除(Mark-Sweep) 复制(Copying) 标记-整理 3、垃圾收集器 Serial收集器 ParNew收集器 Parallel Scavenge收集器 Serial Old收集器 Parallel Old收集器 CMS收集器 G1收集器 二、 内存分配与回收策略 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。 -----《深入理解Java虚拟机》 在 Java填坑工程–JVM那些事儿之Java内存区域 中阐述了Java运行时数据区域,Java语言本身也是支持内存动态分配的,那我们为什么还要了解GC和内存分配呢?(你品,你细品!)----因为当需要排查各种内存溢出、内存泄露问题时,当垃圾收集成为系统高并发量的瓶颈时,当找不到Bug百思不得其解的时候,我们需要进行必要的调控和调节,这就是理由。 一、垃圾收集器 垃圾收集器关注的是JVM中堆和方法区。 1、对象是否存活? 在大多数JVM中,使用 可达性分析 来判定对象是否存活。 可达性分析:通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时

3.JVM 垃圾收集器

橙三吉。 提交于 2019-12-15 18:39:51
Garbage Collect(垃圾回收) 1.1 如何确定一个对象是垃圾? 要想进行垃圾回收,得先知道什么样的对象是垃圾。 1.1.1 引用计数法 对于某个对象而言,只要应用程序中持有该对象的引用,就说明该对象不是垃圾,如果一个对象没有任 何指针对其 引用,它就是垃圾。 弊端 :如果AB相互持有引用,导致永远不能被回收。 1.1.2 可达性分析 通过GC Root的对象,开始向下寻找,看某个对象是否可达 能作为GC Root:类加载器、Thread、虚拟机栈的本地变量表、static成员、常量引用、本地方法 栈的变量等。 1.2 垃圾收集算法 已经能够确定一个对象为垃圾之后,接下来要考虑的就是回收,怎么回收呢? 得要有对应的算法,下面聊聊常见的垃圾回收算法。 1.2.1 标记-清除(Mark-Sweep) 标记 找出内存中需要回收的对象,并且把它们标记出来 此时堆中所有的对象都会被扫描一遍,从而才能确定需要回收的对象,比较耗时      清除 清除掉被标记需要回收的对象,释放出对应的内存空间 缺点 标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程 序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。 (1)标记和清除两个过程都比较耗时,效率不高 (2)会产生大量不连续的内存碎片

NoSQL之Redis——Redis部署与配置

自作多情 提交于 2019-12-15 16:06:06
关系型数据库与非关系型数据库 关系型数据库: 一个机构化的数据库,创建在关系模型基础上,一般面向于记录 包括oracle,mysql,sqlserver,db2 非关系型数据库: 除了主流的关系型数据库意外的数据库,都人为是非关系型的 包括redis,mongdb,hbase,couhdb 非关系型数据库产生背景 对数据库高并发读写需求 对海量数据高效存储与访问需求 对数据库高可扩展性与高可用需求 Redis简介 Redis基于内存运行并支持持久化 采用key-value(键值对)的存储形式 优点: 具有极高的数据读写速度 支持丰富的数据类型 支持数据的持久化 原子性 支持数据备份 1,安装必要的环境组件,并安装redis [root@localhost ~]# yum install gcc gcc-c++ make -y ##安装环境组件 [root@localhost ~]# mount.cifs //192.168.100.3/LNMP-C7 /mnt/ ##挂载 Password for root@//192.168.100.3/LNMP-C7: [root@localhost ~]# cd /mnt/ [root@localhost mnt]# tar zxvf redis-5.0.7.tar.gz -C /opt/ ##解压 [root@localhost mnt]#

京东后台面试(很全面,很符合现在的面试!!)

有些话、适合烂在心里 提交于 2019-12-15 14:09:31
Java笔试面试目录(一个大佬的总结) https://blog.csdn.net/weixin_41835916/article/details/81413498 1.自我介绍。 2.画出项目的架构图,对每层进行解释,为何用MVC分层。 3.exception异常处理结构,常见异常,多catch处理顺序。 4.对多个表的操作,用事务操作如何实现,写代码 5.maven了解吗 6.死锁 OPPO面筋集合14题: https://blog.csdn.net/weixin_39345957/article/details/89000440 7.tomcat如何部署,war包结构,发布工具. 8.jvm相关原理,垃圾回收算法。 常用的垃圾回收算法有: 1. 引用计数法(经典算法) 对于对象设置一个引用计数器,每增加一个对该对象的引用,计数器+1,引用失效则-1.当计数器为0时,对象死亡,被回收。 存在问题: 对象内部频繁的加减操作,会一定程度上增加系统消耗 无法解决对象循环引用的问题(A中引用B,B中引用A,此时两个对象的计数器均不为0,A=NULL,B=NULL本该无效了,但是却无法回收,导致内存泄漏) 2. 标记清除法 该方法分为两个阶段:标记和清除 标记阶段:通过可达性算法,跟踪对象,标记所有和GCRoots节点相关联的对象,剩余没有被标记的对象则为需要回收的对象。 清除阶段

JVM性能优化--Java的垃圾回收机制

半世苍凉 提交于 2019-12-15 10:10:53
一、Java内存结构 1、Java堆(Java Heap)   java堆是java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。   java堆是垃圾收集器管理的主要区域,因此也被成为“GC堆”(Garbage Collected Heap)。从内存回收角度来看java堆可分为:新生代和老生代。从内存分配的角度看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)。无论怎么划分,都与存放内容无关,无论哪个区域,存储的都是对象实例,进一步的划分都是为了更好的回收内存,或者更快的分配内存。   根据Java虚拟机规范的规定,java堆可以处于物理上不连续的内存空间中。当前主流的虚拟机都是可扩展的(通过 -Xmx 和 -Xms 控制)。如果堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。 2、Java虚拟机栈(Java Virtual Machine Stacks)   java虚拟机也是线程私有的,它的生命周期和线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧

C++内存分配方式

穿精又带淫゛_ 提交于 2019-12-14 21:39:50
内存管理是C++最令人头痛的问题,也是C++最有争议的地方。C++高手从中获得了更好的性能,更大的自由,C++菜鸟获取的则是一遍一遍的检查代码。而这一切都源于C++内存管理的灵活性,其多样的内存分配方式就是其灵活性的最好例证之一。 一个程序要运行,就必须先将可执行的程序加载到计算机内存里,程序加载完毕后,会形成一个运行空间,并按照下图所示进行布局。 代码区:存放的是程序的执行代码; 数据区:存放的是全局数据、常量、静态变量等; 堆区:存放的是动态内存,供程序随机申请使用; 栈区:存放的是程序中所用到的局部数据。 这些数据可以动态地反应程序中对函数的调用状态,通过其轨迹也可以研究其函数机制。其中,除了代码区不是我们能在代码中直接控制的,剩余三块都是我们编码过程中可以利用的。 在C++中,数据区又被分成自由存储区、全局/静态存储区和常量存储区,再加上堆区、栈区,也就是说内存被分成了5个区。这5种不同的分区各有所长,适用于不同的情况。 栈区 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元将自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是所分配的内存容量有限。 堆区 堆就是那些由new分配的内存块,用delete来释放内存。如果程序员没有释放掉,那么在程序结束后,操作系统就会自动回收。 自由存储区

JVM底层知识体系

Deadly 提交于 2019-12-14 21:21:41
jvm类加载机制:   加载----验证---准备----解析----初始化----使用-----卸载 一、java的理解   1、平台无关性   2、GC:垃圾回收机制,不用手动释放堆内存   3、语言特性:泛型,反射,lemda表达式   4、面向对象:封装、继承、多态   5、类库:并发库,集合,网络库,IO,NIO   6、异常处理:运行时异常、编译时异常 二、JVM如何加载.class文件  1.1、类从编译到执行的过程:     1、编译器将.java源文件编译为.class字节码文件     2、ClassLoader将字节码文件转换为JVM中的Class<T>对象     3、JVM利用Class<T>对象实例化为T对象。     1.2、ClassLoad的种类:   ClassLoader在java中非常重要,所有Class都是有类加载器进行加载的,作用就是从系统外部获得Class二进制流,交给Java虚拟机进行连接,初始化等操作。     1、BootStrapClassLoader:C++编写,加载核心库java.*     2、ExtClassLoader:Java编写,加载扩展库javax.*     3、AppClassLoader:Java编写,加载程序所在目录。加载类路径下(ClassPath)的类库     4、自定义类加载器:通过继承 java

Java的消亡史

随声附和 提交于 2019-12-14 11:07:54
作为一名程序猿 ,我们每天都在写Code,但你真的了解它的生命周期么?今天就来简单聊下它的生命历程,说起一段Java Code,从出生到game over大体分这么几步:编译、类加载、运行、GC。 编译 Java语言的编译期其实是一段“不确定 ”的过程,因为可能是一个前端编译器把.java文件转变为.class文件的过程;也可能是指JVM的后端运行期编译器(JIT编译器)把字节码转变为机器码的过程;还可能是指使用静态提前编译器(AOT编译器)直接把.java文件编译成本地机器码的过程。但是在这里我们说的是第一类。也是符合我们大众对编译认知的。编译在这个时间段经历了哪些过程呢? 词法、语法分析 词法分析是将源代码的字符流转变为Token集合,而语法分析则是根据Token序列抽象构造语法树(AST)的过程,AST是一种用来描述程序代码语法结构的树形表示形式,语法树的每个节点都代表着程序代码中的一个语法结构,例如包、类型、修饰符、运算符、接口、返回值甚至代码注释都可以是一个语法结构。 填充符号表 完成了语法和词法分析之后,下一步就是填充符号表的过程,符号表中所登记的信息在编译的不同阶段都要用到。在这里延伸一下符号表的概念。符号表是什么呢?它是由一组符号地址和符号信息构成的表格,最简单的可以理解为哈希表的K-V值对的形式。为什么会用到符号表呢?符号表最早期的应用之一就是组织程序代码的信息

zz温故知新:Tomcat调优&JVM内存性能调优

泪湿孤枕 提交于 2019-12-14 09:16:11
Java 性能优化原则: 代码运算性能、内存回收、应用配置(影响Java程序主要原因是垃圾回收,下面会重点介绍这方面) 代码层优化: 避免过多循环嵌套、调用和复杂逻辑。 Tomcat 调优主要内容如下: 1 、增加最大连接数 2 、调整工作模式 3 、启用gzip压缩 4 、调整JVM内存大小 5 、作为Web服务器时,与Apache整合或Nginx 6 、合理选择垃圾回收算法 7 、尽量使用较新JDK版本 生产配置实例: <Connectorport="8080"protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="1000" minSpareThreads="100" maxSpareThreads="200" acceptCount="900" disableUploadTimeout="true" connectionTimeout="20000" URIEncoding="UTF-8" enableLookups="false" redirectPort="8443" compression="on" compressionMinSize="1024" compressableMimeType="text/html,text/xml,text/css,text/javascript"/>

操作系统(存储管理)

核能气质少年 提交于 2019-12-14 07:09:50
操作系统(存储管理) 文章目录 操作系统(存储管理) 一,多层结构的存储器系统 1.1主存 1.2磁盘缓存 二,程序的装入和链接 2.1程序的装入方式 2.1.1绝对装入方式 2.1.2可重定位装入方式 2.1.3动态运行时的转入方式 2.2程序的链接 2.2.1静态连接 2.2.2装入时动态链接 2.2.3运行时动态链接 三,程序存储空间的分配 3.1连续分配存储管理 3.1.1单一连续分配 3.1.2固定分区分配 3.1.3动态分区分配 3.1.4可重定位的分区分配 3.2离散存储空间分配 3.2.1页式存储空间分配 3.2.2段式存储空间分配 3.2.3页式存储和段式存储比较 一,多层结构的存储器系统 主要分为: CPU寄存器 主存 辅存 1.1主存 主存,又叫可执行存储器或内存,主要用来保存进程运行时的程序和数据,处理器都是从主存储器中取到指令和数据的,并将其所取到的指令放入到指令寄存器中,而将其数据放入到数据寄存器中,由于 主存储器(内存)访问速度远远低于CPU执行指令的速度,为了缓和这一矛盾,在计算机系统中引入了寄存器和高速缓存 寄存器 寄存器具有和处理器相同的速度,故对寄存器的访问速度最快,完全能与CPU协调工作,但是价格昂贵 高速缓存 介于寄存器和内存之间,主要用于备用内存中的常用的数据,减少CPU对内存的访问次数 1.2磁盘缓存