JVM与GC
文章平均质量分 66
Java JVM与GC
小镇攻城狮
吃饭的家伙要拿稳咯
展开
-
【JVM】OOM报错的种类
1 Java heap space设置JVM属性-Xms10m -Xmx10m,然后new一个大对象,就能使堆溢出报错。public class JavaHeapSapceDemo { public static void main(String[] args) { byte[] bytes = new byte[80 * 1024 * 1024]; // Exception in thread "main" java.lang.OutOfMemoryError:原创 2021-08-30 17:11:28 · 344 阅读 · 0 评论 -
【JVM】栈溢出报错StackOverflowError
StackOverflowError是错误,不是异常。方法放在栈空间中,默认只有512k-1024k。进行递归调用,就能把栈空间占满。public class StackOverFlowErrorDemo { public static void main(String[] args) { // Exception in thread "main" java.lang.StackOverflowError stackOverflowError(); }原创 2021-08-27 12:16:42 · 690 阅读 · 0 评论 -
【JVM】JVM常用基础参数配置
1 -Xms, -Xmx-Xms初始堆内存-Xmx最大堆内存相关文章:【JVM】JVM参数类型2 -Xss设置单个线程栈的大小,一般默认为512k-1024k。默认值与操作系统的类型有关,windows系统的默认值取决于虚拟内存的大小。等价于-XX:ThreadStackSize3 -Xmn设置年轻代的大小4 -XX:MetaspaceSize设置元空间大小。元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。典型设置案例原创 2021-08-26 15:55:37 · 204 阅读 · 0 评论 -
【JVM】JVM参数类型
1 标配参数-version-help-showversion2 x参数Java程序要运行,会先通过javac命令编译成字节码(.class类文件),再通过java命令解释执行字节码。Java是一种混合型语言。-Xint-Xcomp-Xmixed3 xx参数3.1 Boolean类型使用方式:-XX: +或者-某个属性值。+表示开启,-表示关闭。查看一个正在运行中的java程序,它的某个jvm参数是否开启?具体值是多少?jinfo -flag PrintGCDe原创 2021-08-26 10:35:33 · 122 阅读 · 0 评论 -
【JVM】死亡三连,如何判断常量、对象、类的废弃、死亡、无用
1 如何判断一个常量是废弃常量运行时常量池主要用来回收废弃的常量。如果没有任何对象引用一个常量的话,就说明这个常量是废弃常量。如果此时发生内存回收且有必要的话,这个常量就会被系统清理。2 如何判断对象死亡引用计数法:给对象添加一个引用计数器,每当有一个地方引用它,就加1;每当一个引用失效,就减1。当引用计数器为0时,即可判定对象死亡。可达性分析算法通过GC Roots对象作为起点,从这个节点向下搜索,走过的路径称为引用链。当一个对象到GC Roots没有引用链相连时,则判定对象死亡。原创 2021-05-12 09:04:26 · 3346 阅读 · 0 评论 -
【JVM】类加载过程和双亲委派模型
1 类加载过程说明:加载和连接过程是交叉进行的,加载未结束,连接可能就已经开始了。2 类加载器BootstrapClassLoader,最顶层的加载器,负责加载%JAVA_HOME%/lib目录下的jar包和类。ExtensionClassLoader,加载%JRE_HOME%/lib/ext目录下的jar包和类。AppClassLoader,面向用户的加载器,加载当前应用classpath下的jar包和类。3 双亲委派模型说明1在类加载的时候,系统会首先判断当前类是否被加载过。已经被原创 2021-04-28 15:07:04 · 646 阅读 · 0 评论 -
【JVM】垃圾收集有哪些算法
1 标记-清除算法图例内存整理前内存整理后说明:分为标记和清除阶段。首先标记所有需要回收的对象,标记完成后,统一回收。效率较低,而且会产生大量不连续的碎片。2 复制算法图例内存整理前内存整理后说明:将内存分为大小相同的两块,每次使用其中的一块。当这一块内存使用完后,将存活对象复制到另一块内存,然后把空间清理掉。这样每次都回收一半的内存。3 标记-整理算法图例内存整理前内存整理后说明:首先标记所有需要回收的对象,标记完成后,让所有存活对象向一端移动,然后清原创 2021-05-12 10:42:35 · 72 阅读 · 1 评论 -
【JVM】Java垃圾收集器有哪些
相关文章:【JVM】垃圾收集有哪些算法垃圾收集算法是内存回收的方法;垃圾收集器是内存回收的具体实现。1 Serial收集器Serial(串行)收集器是一个单线程收集器。新生代采用复制算法、老年代采用标记-整理算法。2 ParNew收集器ParNew收集器是Serial的多线程版本。新生代采用复制算法、老年代采用标记-整理算法。3 Parallel Scavenge收集器Parallel Scavenge收集器关注点是吞吐量,即CPU中运行用户代码的时间与CPU总消耗时间的比值。新生原创 2021-05-12 14:54:56 · 99 阅读 · 0 评论 -
【JVM】Java内存区域(面试必背)
JVM在运行Java程序时,会把它管理的内存划分为不同的区域,分别有不同的职能。需要记住一幅图JDK1.8之前:JDK1.8:区别:JDK1.8中取消了方法区,在直接内存(非运行时数据区)中添加了元空间。线程私有区域:程序计数器虚拟机栈本地方法栈线程共享区域:堆方法区直接内存1 程序计数器1.1 实现代码流程控制,如:顺序、选择、循环、异常处理等。1.2 在多线程情况下,记录当前线程执行的位置。1.3 是唯一一个不会出现OOM的内存区域,它的生命周期随着线程创建而创建,原创 2021-04-28 10:39:29 · 860 阅读 · 0 评论 -
【JVM】强引用、软引用、弱引用、虚引用
1 强引用如果一个对象具有强引用,垃圾回收器不会回收它。当内存空间不足时,JVM即便抛出OutOfMemoryError,也不会回收具有强引用的对象。2 软引用如果内存空间足够,垃圾回收器就不会回收;如果内存空间不足,就会回收这些对象的内存。软引用可以实现内存敏感的高速缓存。软引用可以加速垃圾内存的回收速度,防止内存溢出。3 弱引用弱引用与软引用的区别:具有弱引用的对象拥有更短暂的生命周期。一旦发现具有弱引用的对象,不管内存空间是否足够,都会回收。4 虚引用如果一个对象仅持有虚引用,那么它就原创 2021-05-13 12:56:44 · 2574 阅读 · 1 评论 -
【JVM】Java堆内存的新生代和老年代
edn区、s0、s1都属于新生代,tentired属于老年代。s指survivor。对象会在eden区分配内存,在经历一次新生代垃圾回收后,如果对象还存活,则进入s0或者s1,并且对象的年龄会加1。当年龄增加到一定程度(默认15岁,可以通过-XX:MaxTenuringThreshold),就会被晋升到老年代。大对象和长期存活的对象直接进入老年代。参考资料JavaGuide公众号文章...原创 2021-05-09 09:58:29 · 3311 阅读 · 0 评论 -
【JVM】类文件(class文件)结构
Class文件格式采用类似C语言结构体的伪结构来存储数据,这种结构只有两种数据类型:无符号数和表。1 魔数确定这个文件是否为一个能被虚拟机接收的 class 文件。如果一个文件不是以0xCAFEBABE开头,那它就肯定不是Java class文件。2 文件版本Class 文件的版本号,保证编译正常执行。3 常量池简单理解为class文件的资源从库。是在文件中第一个出现的表类型数据项目。是占用Class文件空间最大的数据项目之一。主要存放两大常量:字面量和符号引用。4 访问标志识别一原创 2021-04-28 15:54:48 · 5125 阅读 · 0 评论 -
【JVM】Java对象的创建过程
1 类加载检查虚拟机遇到new指令时,会去常量池中检查是否有这个类的符号引用,并且检查这个符号引用代表的类是否被加载、解析、初始化。2 分配内存对象所需内存大小在类加载完成后即可确定,从Java堆中划分一块确定大小的内存。内存分配的两种方式:2.1 指针碰撞适用场合:堆内存规整原理:用过的内存放一边,没用过的放另一边,中间有一个分界值指针。向着没用过内存方向将分界值指针移动对象内存大小位置。GC收集器:Serial、ParNew2.2 空闲列表适用场合:堆内存不规整原理:虚拟机维护一.原创 2021-05-08 17:02:56 · 5156 阅读 · 0 评论