![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
————JVM
量变决定质变
牢记理想,毋忘奋斗!
展开
-
JVM虚拟机介绍
虚拟机分为系统虚拟机、程序虚拟机系统虚拟机 Visual Box、VMware 对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台程序虚拟机 JVM 专门为执行单个计算机程序而设计 在Java虚拟机中执行指令,称为Java字节码指令相同点资源使用 无论系统虚拟机,还是程序虚拟机 在上面运行的软件,只能使用虚拟机提供的资源...原创 2018-08-10 20:02:54 · 635 阅读 · 0 评论 -
JVM方法区内存分配
方法区内存-XX:PermSize 设置初始化方法区内存-XX:MaxPermSize 设置最大方法区,也称永久区的内存 默认情况下,为64M方法区一块所有线程共享的内存区域,用于保存系统的类信息 如果,系统运行时产生大量的类,需要设置一个合适的方法区 否则,会出现永久区内存溢出异常分析代码 可以使用一些工具,来分析程序中类与方法的代码量...原创 2018-08-17 22:51:18 · 1163 阅读 · 0 评论 -
JVM堆内存分配
堆内存配置-Xms,设置程序启动时,初始堆大小 -Xms,设置程序启动时,最大堆大小 -XX:+PrintGC,打印GC日志信息 -XX:+UseSerialGC,配置串行回收器 -XX:+PrintGCDetails,查询各区详细信息 -XX:+PrintCommandLineFlags,输入详细参数配置测试package com.bjsxt.base001;p...原创 2018-08-17 22:56:29 · 1517 阅读 · 0 评论 -
JVM堆内存溢出
堆内存溢出配置参数 初始化,分配1M 最大内存,分配1M-Xms1m -Xmx1m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC代码package com.bjsxt.base001;public class Test02 { public static void main(Stri...原创 2018-08-17 22:58:53 · 291 阅读 · 0 评论 -
JVM堆溢出分析
堆溢出分析-XX:+HeapDumpOnOutOfMemoryError 在溢出时,导出整个堆信息-XX:HeapDumpPath 设置导出的存放路径内存分析工具 Memory Analyzerpackage com.bjsxt.base001;import java.util.Vector;public class Test03 { public st...原创 2018-08-17 23:00:51 · 496 阅读 · 0 评论 -
JVM中GC算法
GC算法引用计数法 标记清除法 复制算法 标记压缩法 分代算法 分区算法引用计数法比较古老而经典的GC算法 核心就是在对象,被其他所引用,计数器加1 当引用失效时,计数器减1存在问题 无法处理循环引用的情况 每次加减操作,比较浪费系统性能标记清除法分为标记和清除,两个阶段进行处理内存中的对象存在问题 控件碎片问题,垃圾回收之后的空间是不连续的...原创 2018-08-18 11:33:08 · 145 阅读 · 0 评论 -
JVM堆GC回收次数
GC回收次数减少GC次数,可以提高性能 一般,可以设置初始内存,等于最大分配内存当非常空间不足的时候,会进行GC回收 当内存空间充足的时候,可以减少GC回收次数package com.bjsxt.base001;public class Test02 { public static void main(String[] args) { byte[...原创 2018-08-18 11:38:05 · 4955 阅读 · 0 评论 -
JVM中GC的停顿现象
GC停顿现象GC任务是识别和回收垃圾对象,进行内存清理 为了让GC可以高效的执行,在进行GC时,系统会进入一个停顿的状态停顿目的 终止所有应用线程 只有这样,系统才不会有新的垃圾产生停顿保证了系统状态 在某一瞬间的一致性,有益于更好的标记垃圾对象 因此,在GC时,都会产生应用程序的停顿减少GC 可以减少程序的停顿,提高系统的性能...原创 2018-08-18 11:40:35 · 4941 阅读 · 0 评论 -
JVM堆新生代分配
新生代分配-Xmn,设置新生代的大小 设置新生代越大,老年代就会越小这个参数,对系统性能与GC行为有很大的影响 一般,新生代设置为整个堆空间的1/3~1/4左右package com.bjsxt.base001;public class Test02 { public static void main(String[] args) { byte[...原创 2018-08-18 11:45:17 · 417 阅读 · 0 评论 -
JVM堆新生代分配比例
新生代分配-XX:SurvivorRatio 设置新生代分配比例表示Eden空间与from/to空间的比例 XX:SurvivorRatio=eden/from=eden/topackage com.bjsxt.base001;public class Test02 { public static void main(String[] args) { ...原创 2018-08-19 08:26:49 · 4056 阅读 · 0 评论 -
JVM堆老年代分配比例
老年代分配-XX:NewRatio 设置老年代与新生代的比例-XX:NewRatio=老年代/新生代 尽可能将对象,预留在新生代 减少老年代的GC次数package com.bjsxt.base001;public class Test02 { public static void main(String[] args) { byte[] b ...原创 2018-08-19 08:29:26 · 3022 阅读 · 0 评论 -
JVM新生代老年代GC分析
新生代复制算法新生代特点 GC频繁、不稳定 每次清理内存,清理的比较多 每次回收耗时非常短比如,有100个对象 可能90个需要清理,只需要复制其中的10个,到另一个内存空间老年代标记压缩法老年代特点 GC不频繁,相对稳定 每次清理内存,清理的比较少 已经经历了很多次的GC 每次回收耗时非常长比如,有100个对象 可能90个都需要压缩拷贝到内存的另一端,...原创 2018-08-20 09:25:18 · 1297 阅读 · 0 评论 -
JVM堆对象初始化
对象初始化对象,首次创建都会被放置在新生代的eden区 如果,没有GC,对象不会离开eden区只要,对象的年龄达到了一定的大小 就会自动离开新生代,进入老年代对象年龄是由对象经历的GC次数决定的 新生代每次GC,只要对象没有回收,年龄都会加1package com.bjsxt.base001;import java.util.HashMap;import jav...原创 2018-08-20 09:28:10 · 350 阅读 · 0 评论 -
JVM中GC对象配置
对象年龄配置-XX:MaxTenuring Threshold 配置新生代对象的最大年龄当超过这个年龄,对象就会进入老年代 默认值为15回收过程对象,首次创建都会被放置在新生代的eden区 如果,没有GC,对象不会离开eden区只要,对象的年龄达到了一定的大小 就会自动离开新生代,进入老年代对象年龄 是由对象经历的GC次数决定的,新生代每次GC 只要,对象没...原创 2018-08-20 09:31:08 · 417 阅读 · 0 评论 -
JVM中GC大对象配置
大对象配置-XX:PretenureSizeThreshold 配置直接进入老年代的对象大小 如果,对象不是太大TLAN区,优先分配空间大对象 新生代eden区,无法装入时,会直接进入老年代 可以配置对象大小,直接进入老年代package com.bjsxt.base001;import java.util.HashMap;import java.util.Map;...原创 2018-08-20 09:35:20 · 4875 阅读 · 0 评论 -
JVM中GC小对象配置
小对象配置-XX:+UseTLAB 表示,使用TLABTLABThread Local Allocation Buffer 线程本地分配缓存 一个线程专用的内存分配区域,为了加速对象分配每一个线程,都会产生一个TLAB,该线程独享的工作区域 每一个线程,都会默认使用TLAB区域 TLAB用来避免多线程冲突问题,提高对象分配效率内存大小 TLAB空间一般不会太大...原创 2018-08-20 09:41:32 · 258 阅读 · 0 评论 -
JVM栈内存分配
栈内存分配-Xss 配置线程的最大栈空间 这个参数,决定了函数可调用的最大深度package com.bjsxt.base001;public class Test04 { //-Xss1m //-Xss5m //栈调用深度 private static int count; public static void recursi...原创 2018-08-17 22:49:35 · 925 阅读 · 0 评论 -
JVM的工作模式
工作模式包括Client、Server配置参数 -client,指定Client模式 -server,指定Server模式区别Client模式 启动较快 如果,不追求系统的长时间使用性能,仅仅是测试 可以使用Client模式Server模式 启动较慢 因为,会进行复杂的系统性能信息收集 使用更复杂的算法,对程序进行优化一般情况 生产环境会使用Serve...原创 2018-08-17 22:39:39 · 533 阅读 · 0 评论 -
JVM直接内存配置
直接内存-XX:MaxDirectMemorySize 设置直接内存 默认值,为最大堆空间大小,即-Xmx直接内存达到上限时,会触发垃圾回收 如果,溢出,也会抛出OOM异常应用在NIO中,跳过了Java堆 使程序可以直接访问,原生堆空间 因此,在一定程度上,加快了内存空间的访问速度注意 JDK 1.7之后,不需要考虑 配不配置,都可以...原创 2018-08-17 22:38:04 · 2198 阅读 · 0 评论 -
JVM的结构组成
JVM构成1、类加载子系统 2、方法区 3、Java堆 4、直接内容 5、Java栈 6、本地方法栈 7、垃圾收集系统 8、PC寄存器 9、执行引擎类加载子系统负责从文件系统,或者网络中加载Class信息 加载的信息存放在一块称为方法区的内存空间方法区存放类信息、常量信息、常量池信息、包括字符串字面量和数字常量等Java堆在Java虚拟机启动的...原创 2018-08-10 20:05:50 · 944 阅读 · 0 评论 -
JVM在JDK1.8的变化
JVM变化在JDK1.8之后,堆的永久区取消了 由元空间取代JDK 1.7 堆内存模型 JDK 1.8 堆内存模型原创 2018-08-10 20:07:06 · 2597 阅读 · 0 评论 -
JVM的堆、栈、方法区
堆解决数据存储的问题 数据怎么存放,存放在哪里栈解决程序的运行问题 程序如何执行,如果处理数据方法区解决堆栈信息的产生,是先决条件 辅助堆栈的快永久区Perm比如 创建一个对象User User user=new User();User类的一些信息,类信息、静态信息都存在方法区中 User实例化出来之后,存储到Java堆中,一块内存空间对象引用 ...原创 2018-08-10 20:08:08 · 158 阅读 · 0 评论 -
JVM堆
堆几乎所有的对象,都存放在堆中 堆是完全自动化管理的,通过垃圾回收机制 垃圾对象会自动清理,不需要显式的释放堆的内存模型垃圾收集机制的不同,堆内存结构可能不同新生代,存放新生的对象,或者年龄不大的对象 老年区,存放老年对象,年龄比较大对象年龄 对象没经过一次GC,年龄就会加1 一般,经过15次GC之后,还活着,也就是达到15岁之后,就会放到老年区永久区,存放永...原创 2018-08-10 20:10:37 · 486 阅读 · 0 评论 -
JVM栈
栈一个线程,私有的内存空间 线程创建的时候,对应的栈被创建组成部分局部变量表 操作数栈 帧数据区局部变量表 用于保存函数的参数,局部变量操作数栈 用于保存计算过程的中间结果 作为计算过程中,变量的临时存储空间帧数据区 用于保存访问常量池的指针,方便程序访问常量池 存放异常处理表,异常处理表作用 当函数返回,或者出现异常时 方便发送异常的时候,找到异常...原创 2018-08-10 20:11:43 · 399 阅读 · 0 评论 -
JVM方法区
方法区所有线程共享的内存区域 保存系统的类信息 类的字段、方法、常量池等方法区大小决定了系统可以保存多少个类 如果,系统定义了太多的类,导致方法区溢出 JVM就会抛出内存溢出线程共享堆、方法区,是线程共享的 栈,不是线程共享的 每一个线程会分配一个独立的栈Perm可以理解为永久区Perm...原创 2018-08-10 20:13:26 · 610 阅读 · 0 评论 -
内存空间的分配
在内存中,供用户使用的内存空间分为三部分程序存储区 静态存储区 动态存储区程序存储区存放函数体的二进制代码,就是存放程序代码 程序中所用的数据,分别存放在静态存储区,动态存储区中静态存储区数据在程序的开始就分配好内存区,在整个程序执行过程中 它们所占的存储单元是固定的,在程序结束时就释放 因此,静态存储区数据一般为全局变量。动态存储区数据则是在程序执行...原创 2018-08-06 20:07:25 · 1450 阅读 · 0 评论 -
内存泄漏
内存泄漏是指程序中己动态分配的堆内存 由于某种原因程序未释放或无法释放,造成系统内存的浪费 导致,程序运行速度减慢,甚至系统崩溃等系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete) 结果,申请到的那块内存,你自己也不能再访问,也许你把它的地址给弄丢了,而系统也不能再次将它分配给需要的程序就相当于你租了个带钥匙的柜子,你存完东西之后把柜子锁上之后,把钥匙丢...原创 2018-08-06 20:13:04 · 142 阅读 · 0 评论 -
内存溢出
内存溢出就是内存不够 通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了 主机内安装的内存所承受大小,就叫内存溢出原因1、内存中加载的数据量过于庞大,如一次从数据库取出过多数据2、集合类中有对对象的引用,使用完后未清空,使得JVM不能回收3、代码中存在死循环或循环产生过多重复的对象实体4、使用的第三方软件中的BUG5、启动参数内存值设定的过小解...原创 2018-08-06 20:16:19 · 134 阅读 · 0 评论 -
JVM的内存分配
内存分配寄存器 栈 堆 静态域 常量池寄存器在程序中无法控制栈存放基本类型的数据和对象的引用 但是,对象本身不存放在栈中,而是存放在堆中堆存放用new产生的数据静态域存放在对象中用static定义的静态成员常量池存放常量 非RAM存储:硬盘等永久存储空间...原创 2018-08-06 20:18:29 · 91 阅读 · 0 评论 -
JVM的栈
栈栈的基本单位是帧,或栈帧Java线程每当一个Java线程运行的时候 Java虚拟机会为该线程分配一个Java栈该线程在执行某个Java方法的时候,向Java栈压入一个帧 这个帧用于存储参数、局部变量、操作数、中间运算结果等。 当这个方法执行完的时候,帧会从栈中弹出私有性栈上的所有数据是私有的,其他线程,都不能访问该线程的栈数据在函数中定义的一些基本类型的...原创 2018-08-06 20:20:40 · 114 阅读 · 0 评论 -
JVM的堆
堆用来存放由new创建的对象和数组。垃圾回收机制在堆中分配的内存 由Java虚拟机的自动垃圾回收机制,来管理堆的内存。栈与堆堆主要是用来存放Java对象的 栈主要是用来存放对象引用的引用变量在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量 让栈中这个变量的取值,等于数组或对象在堆内存中的首地址,栈中的这个变量,就成了数组或对象的引用变量...原创 2018-08-06 20:27:29 · 190 阅读 · 0 评论 -
JVM的常量池
常量池指的是在编译期被确定 并被保存在已编译的class文件中的一些数据。存放内容基本类型 对象型 符号引用除了包含代码中所定义的各种基本类型 比如,int、long等,和对象型,比如,String及数组,的常量值,比如final修饰外 还包含一些以文本形式出现的符号引用,1、类和接口的全限定名 2、字段的名称和描述符 3、方法的名称和描述符虚拟机必须为每...原创 2018-08-06 20:30:28 · 142 阅读 · 0 评论 -
JVM栈的数据共享
数据共享栈有一个很重要的特殊性 就是存在栈中的数据可以共享。假设 同时定义: int a=3; int b=3;编译器先处理 int a = 3; 首先,它会在栈中创建一个变量为 a 的引用 然后,查找栈中是否有 3 这个值 如果,没找到,就将 3 存放进来,然后将 a 指向 3接着处理 int b = 3; 在创建完 b 的引用变量后 因为在栈中已经有 3 这个值,...原创 2018-08-06 20:34:09 · 1874 阅读 · 4 评论 -
JVM实例化对象
方式一Object obj = new Object(); 比如public void test() { for (int i = 0; i < 100; i++) { Object obj = new Object(); }}写在100个循环内,等于你有100个引用,对应了100个对象 所以,100个对象在一段时间内,都是会占用内存 ...原创 2018-08-06 20:37:21 · 378 阅读 · 0 评论 -
JVM中TLAB区
TLAB区配置-XX:+UseTLAB 表示,是否使用TLAB-XX:+TLABSize 表示,设置TLAB大小-XX:TLABRefillWasteFraction 表示,设置进入TLAB空间,单个对象大小是一个比例值,默认为64 如果,对象小于整个空间的1/64,则放在TLAB区 如果,对象大于整个空间的1/64,则放在堆区-XX:+PrintTLAB 表示,查...原创 2018-08-20 09:46:31 · 3685 阅读 · 1 评论