荒野大飞
。
展开
-
JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)
为什么分代GC算法要把堆分成年轻代和老年代?⚫ 系统中的大部分对象,都是创建出来之后很快就不再使用可以被回收,比如用户获取订单数据,订单数据返回给用户之后就可以释放了。⚫ 老年代中会存放长期存活的对象,比如Spring的大部分bean对象,在程序启动之后就不会被回收了。⚫ 在虚拟机的默认设置中,新生代大小要远小于老年代的大小分代GC算法将堆分成年轻代和老年代主要原因有:1、可以通过调整年轻代和老年代的比例来适应不同类型的应用程序,提高内存的利用率和性能。原创 2023-11-27 19:56:13 · 444 阅读 · 0 评论 -
JVM——运行时数据区(程序计数器+栈)
⚫ Java虚拟机在运行Java程序过程中管理的内存区域,称之为运行时数据区。⚫ 《Java虚拟机规范》中规定了每一部分的作用。原创 2023-11-16 12:36:28 · 435 阅读 · 0 评论 -
JVM——垃圾回收算法(垃圾回收算法评价标准,四种垃圾回收算法)
⚫ Java是如何实现垃圾回收的呢?简单来说,垃圾回收要做的有两件事:1、找到内存中存活的对象2、释放不再存活对象的内存,使得程序能再次利用这部分空间⚫ 1960年John McCarthy发布了第一个GC算法:标记-清除算法。⚫ 1963年Marvin L. Minsky 发布了复制算法。本质上后续所有的垃圾回收算法,都是在上述两种算法的基础上优化而来。原创 2023-11-26 10:55:51 · 302 阅读 · 0 评论 -
JVM——运行时数据区(堆+方法区+直接内存)
⚫ JDK8将方法区存放在元空间中,元空间位于操作系统维护的直接内存中,默认情况下只要不超过操作系统承受的上限,可以一直分配。当常量池加载到内存中之后,可以通过内存地址快速的定位到常量池中的内容,这种常量池称为运行时常量池。⚫ JDK8及之后的版本将方法区存放在元空间中,元空间位于操作系统维护的直接内存中,默认情况下只要不超过操作系统承受的上限,可以一直分配。⚫ used指的是当前已使用的堆内存,total是java虚拟机已经分配的可用堆内存,max是java虚拟机可以分配的最大堆内存。原创 2023-11-16 21:19:29 · 669 阅读 · 0 评论 -
JVM——产生内存溢出原因
但是由于用户的并发请求量有可能很大,同时处理数据的时间很长,导致大量的数据存在于内存中,最终超过了内存的上限,导致内存溢出。这类问题的处理思路和内存泄漏类似,首先要定位到对象产生的根源。在使用HashMap的场景下,如果使用这个类对象作为key,HashMap在判断key是否已经存在时会使用这些方法,如果重写方式不正确,会导致相同的数据被保存多份。⚫ 1、非静态的内部类默认会持有外部类,尽管代码上不再使用外部类,所以如果有地方引用了这个非静态内部类,会导致外部类也被引用,垃圾回收时无法回收这个外部类。原创 2023-11-29 21:43:55 · 468 阅读 · 0 评论 -
JVM——垃圾回收(方法区中的垃圾回收和(堆回收)自动垃圾回收)
⚫ 在C/C++这类没有自动垃圾回收机制的语言中,一个对象如果不再使用,需要手动释放,否则就会出现内存泄漏。我们称这种释放对象的过程为垃圾回收,而需要程序员编写代码进行回收的方式为手动回收。⚫ 内存泄漏指的是不再使用的对象在系统中未被回收,内存泄漏的积累可能会导致内存溢出。原创 2023-11-25 22:51:02 · 654 阅读 · 0 评论 -
JVM——内存溢出和内存泄漏
⚫ Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。⚫ 少量的内存泄漏可以容忍,但是如果发生持续的内存泄漏,就像滚雪球雪球越滚越大,不管有多大的内存迟早会被消耗完,最终导致的结果就是内存溢出。⚫ 内存泄漏导致溢出的常见场景是大型的Java后端应用中,在处理用户的请求之后,没有及时将用户的数据删。原创 2023-11-29 20:21:21 · 551 阅读 · 0 评论 -
JVM——垃圾回收器(G1,JDK9默认为G1垃圾回收器)
JDK9之后默认的垃圾回收器是G1(Garbage First)垃圾回收器。Parallel Scavenge关注吞吐量,允许用户设置最大暂停时间 ,但是会减少年轻代可用空间的大小。CMS关注暂停时间,但是吞吐量方面会下降。而G1设计目标就是将上述两种垃圾回收器的优点融合:1.支持巨大的堆空间回收,并有较高的吞吐量。2.支持多CPU并行垃圾回收。3.允许用户设置最大暂停时间。原创 2023-11-27 19:52:35 · 405 阅读 · 0 评论 -
JVM——几种常见的对象引用
可达性算法中描述的对象引用,一般指的是强引用,即是GCRoot对象对普通对象有引用关系,只要这层关系存在,普通对象就不会被回收。除了强引用之外,Java中还设计了几种其他引用方式:⚫ 软引用⚫ 弱引用⚫ 虚引用⚫ 终结器引用。原创 2023-11-25 23:23:03 · 571 阅读 · 0 评论 -
单例设计模式
1.所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。2.单例设计模式有两种方式:1)饿汉式。2)懒汉式2.单例设计模式的应用实例1.步骤1)构造器私有化=》防止用户直接new出一个对象2)类的内部创建对象3)向外暴露一个静态的公共方法。4)代码实现2.单例模式-饿汉式package com.demo.single_;public class test01 { pub原创 2022-05-19 11:51:46 · 1237 阅读 · 0 评论 -
Java——代码块
> 代码块又称为初始化块,属于类中的成员(类的一部分),类似于方法,讲逻辑语句封装在方法体中,用{}抱起来;> > 但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象或类显式调用。基本语法> (修饰符)(可有可无){代码};> 注:> 1.修饰符可选,要写只能写static> 2.代码块可分为两类,使用static修饰的叫静态代码块,没有static修饰的叫普通代码块。> 3.;可有可无原创 2022-05-17 12:43:02 · 1399 阅读 · 27 评论 -
Java类变量和类方法
目录1.static静态变量2.类变量(静态变量的访问)类方法1.static静态变量1 静态变量被同一个类的所有对象共享2.static类变量在类加载的时候就生成使用static保存在class实例的尾部,在堆中3.和C语言C++有点像package com.demo.static_;import java.sql.SQLOutput;public class childgeme { public static void main(String[] args) {原创 2022-05-16 16:00:18 · 507 阅读 · 1 评论 -
LeetCode——746. 使用最小花费爬楼梯
目录题目1.链接2.题目描述3.解题思路4.题解题目1.链接746. 使用最小花费爬楼梯.2.题目描述3.解题思路动态规划这里的每一级楼梯都是有价格的,想要跨过它,就要交保护费,而我们每次可以从前一个楼梯或者前两个楼梯爬上来,所以,不难写出动态规划方程:状态定义:dp[i] 表示到达第 i 级楼梯所需要的最小代价(注意:是到达,还没有跨过)。转移方程:dp[i] = min(dp[i-2]+cost[i-2], dp[i-1]+cost[i-1]),要想到达 i,要么交 i-2 的保护费原创 2022-02-19 23:51:07 · 487 阅读 · 0 评论