2022-09-27JVM系列00

内存结构

image-20220927084453999

程序计数器(寄存器)

基本定义

Program Counter Register 程序计数器(寄存器):

  • 作用: 是记住下一条jvm指令的执行地址

  • 特点

    • 是线程私有的
    • 不会存在内存溢出

每一个线程都对应一个程序计数器, 用于存储下一个指令的地址, 不存在内存溢出的原因是 :

首先,我们熟悉的栈和堆,都是可以通过运行时对内存需求的扩增导致内存不够用的情况

比如某个线程递归调用,随着调用层次的加深,可能会出现栈空间不足的情况,这时候如果可以动态扩增,jvm就会向申请更多的内存空间来扩充栈,当没有更多的内存空间得以申请的时候,就会发生OutOfMemoryError。

但是,程序计算器仅仅只是一个运行指示器,它所需要存储的内容仅仅就是下一个需要待执行的命令的地址,无论代码有多少,最坏情况下死循环也不会让这块内存区域超限,因为程序计算器所维护的就是下一条待执行的命令的地址,所以不存在OutOfMemoryError

2022-09-27JVM系列00

垃圾回收

参考文档

如何判断对象可以回收

引用计数法

参考文章

基本介绍

  • 引用计数法(reference counting)。它的做法是为每个对象添加一个引用计数器,用来统计指向该对象的引用个数。一旦某个对象的引用计数器 为 0,则说明该对象已经死亡,便可以被回收了。
  • 具体实现如下 :
    • 如果有一个引用,被赋值为某一对象,那么将该对象的引用计数器 +1。
    • 如果一个指向某一对象的引用,被赋值为其他值,那么将该对象的引用计数器 -1。也就是说,我们需要截获所有的引用更新操作,并且相应地增减目标对象的引用计数器

双指针扫描题目

167.两数之和II-输入有序数组

题目描述

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1]numbers[index2] ,则 1 <= index1 < index2 <= numbers.length

以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1index2

你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

你所设计的解决方案必须只使用常量级的额外空间。

示例 1:

输入:numbers = [2,7,11,15], target = 8
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

15.三数之和

题目描述

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意: 答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。