java - What’s the difference between StackOverflowError and OutOfMemoryError - Stack Overflow

Short answer:

  • OutOfMemoryError is related to Heap.
  • StackOverflowError is related to stack

Long answer:

When you start JVM you define how much RAM it can use for processing. JVM divides this into certain memory locations for its processing purpose, two of those are Stack & Heap

If you have large objects (or) referenced objects in memory, then you will see OutofMemoryError. If you have strong references to objects, then GC can’t clean the memory space allocated for that object. When JVM tries to allocate memory for new object and not enough space available it throws OutofMemoryError because it can’t allocate the required amount of memory.

How to avoid: Make sure un-necessary objects are available for GC

All your local variables and methods calls related data will be on the stack. For every method call, one stack frame will be created and local as well as method call related data will be placed inside the stack frame. Once method execution is completed, the stack frame will be removed. ONE WAY to reproduce this is, have an infinite loop for method call, you will see stackoverflow error, because stack frame will be populated with method data for every call but it won’t be freed (removed).

How to avoid: Make sure method calls are ending (not in an infinite loop)

android 调试时,logcat 错误信息一闪而过

  • Android 手机调试不输出错误日志与错误日志一闪而过的问题 - liaoyi 的博客 - CSDN 博客

    原来是华为手机(有可能其他手机也有类似的问题)关闭了输出错误日志的功能。现在我们就需要打开这个功能

    1. 进入拨号界面输入:_#_#2846579#*# (当你输入完了之后会自动打开 手机的另外一个设置的板块界面)
    2. 依次选择 —> 后台设置 —> LOG 设置 —> LOG 开关 点击打开(手机版本不同界面选项也不同,有的选择 AP 日志勾选,但是大致内容都一样)
    3. 重新启动手机(比较新的版本不需要重启)

    同时你可能会遇到错误日志一闪而过的问题,这个可能是华为手机在手机程序崩溃之后系统调用了一些程序,做了一些操作吧,我们没办法去禁止系统做这些操作但是我们可以在

    点击设置 —> 进入手机开发者选项 —> 打开手机 USB 调试功能 —> (在此功能模块里面)选择日志记录器缓冲区大小
    选择一个大一点的缓冲区(具体自己看手机情况选择)

  • android studio logcat 一闪而过 - z736232402 的博客 - CSDN 博客

    as 默认选择当前进程,简单点说就是当前进程,我的理解是,如果崩溃了,进程就结束了,所以,就闪过了
    解决也很简单,第一种就是出现的时候点击下鼠标,logcat 就会停留。第二种就是不要用选择当前的,选择 no filter,如果东西太多,就加过滤,加上包名即可。

插件

  • Adblock Plus

    拦截广告

  • Auto Tab Discard

    Auto Tab Discard a lightweight extension that uses the native method (tabs.discard) to unload or discard browser tabs which significantly reduces the memory footprint of your browser when many tabs are in use.

  • Gesturefy

    Navigate, operate and browse faster with mouse gestures! A customizable mouse gesture add-on with a variety of different commands.

  • HightlightAll

    Highlights all occurrences of the selected text.

  • Markdown Link

    Generates a markdown link from title and URI of the current page. (alt + insert)

  • Octotree

    Github code tree on steroids

  • Proxy SwitchyOmega

    proxy setting

  • Remove Redirect

    Remove intermediary pages that some pages use before redirecting to a final page.

  • FeHelper

    FE 助手:JSON 工具、代码美化、代码压缩、二维码工具、网页定制工具、便签笔记,等等

  • ScrollAnywhere

    Drag scrollbar with your middle mouse button anywhere on the page. Supports also “grab and drag” style and Momentum.

  • Vimiue

    The Hacker’s Browser. Vimium provides keyboard shortcuts for navigation and control in the spirit of Vim.

firefox 设置每次访问时检查缓存

  1. 在 firefox 的地址栏上输入 about:config 回车
  2. 找到 browser.cache.check_doc_frequency 选项,双击将
  3. 改成 1 保存即可。

选项每个值都是什么含义的。请看下面的解释:
0: Once per session 每个进程一次 每次启动 Firefox 时检查
1: Each time 【开发人员强烈建议开这个】每次访问此页时检查
2: Never
3: When appropriate/automatically

前端

token 过期重新登录后自动发起上个请求

举个获取用户的 vip 信息的例子

描述

  1. 用户用带token的 Header 头来获取数据:/user/vip/get_info
  2. 后端返回 606, token过期
  3. 前端重新登录,并发起 /user/vip/get_info 来获取数据;(这个过程在 app 后台进行,不要显示给用户)

方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 伪代码

// reqBackup 可以也可以用 localStorage 来存储
var reqBackup;
function login(url, param) {
var data = http.fetch(url, param);
if (data.code === 200 && reqBackup.url) {
reqBackup = {};
fetchData(reqBackup.url, reqBackup.param, reqBackup.callback);
}
}

function fetchData(url, param, callback) {
var data = http.fetch(url, param);
// 606, token过期
if (data.code === 606) {
reqBackup.url = url;
reqBackup.param = param;
reqBackup.callback = callback;
login();
return;
}

if (data.code === 200) {
callback(data);
return;
}
}

后台权限设计

账号: 登录系统的账号;

角色: 运营、商家、财务、客服、管理员;

权限: 页面权限,操作权限,数据权限;

关系

一个账号有多个角色;一个角色有多个权限;

参考

ACL

RBAC
手撸 Java Web RBAC 权限管理 - 云+社区 - 腾讯云
Premission-Study/README.md at master · zhaojun1998/Premission-Study

PGP

描述

PGP(Pretty Good Privacy),用来提高安全性的软件,可以用来验证文件的合法性;例如常用来给邮件加密、解密及验证,以提高电子邮件交流的安全性;

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 需要安装 rng-tools才能成功生成 gpg 密钥
apt install rng-tools

# 生成gpg密钥
gpg --gen-key

# 查看公钥
gpg --list-keys

# 查看私钥
gpg --list-secret-keys

# 上传公钥
gpg --keyserver hkp://pgp.mit.edu --send-keys FD9EF47E271531EC53C8F6B1EE2E9AE32588D3D8
# or
gpg --keyserver hkp://pgp.mit.edu --send-keys EE2E9AE32588D3D8

# 用户下载公钥
gpg --keyserver hkp://pgp.mit.edu --recv-keys EE2E9AE32588D3D8

# 对文件生成 asc 文件(会生成)以 .asc 的后缀文件
# 参数 -a 表示创建 ASCII 的输出;
# 参数 -b 表示创建一个独立的文件;
gpg -ab test.sh

# 对文件是否被修改进行验证
gpg --verify test.sh.asc

参考资料

《Maven 实战》——版本管理(C13.6)

死锁

解决思路就是:避免同时操作数据;

首先我们执行
show engine innodb status\G;
查看死锁情况,也可以
mysql -u root -p --execute="show engine innodb status \G"> c:/mysql.log
把死锁信息输出到本地磁盘,查看起来比较方便
mysql 死锁分析 - 那片天空!那片海! - CSDN 博客

例如:

通过定位死锁的数据库: show engine \G,发现一个统计任务、一个改价任务,同时修改同一个端口的内容,导致死锁。

解决方法:将两个任务的时间错开,改价的为每分钟的 0 秒触发;统计的为每两分钟的 30 秒触发;

日志文件被删除后,无法正常启动

通过systemctl status mariadb.service来查看缺少什么文件,创建对应的即可,
如果是权限问题,把外层的文件夹修改下权限 /var/log/mysql
然后重启: systemctl restart mariadb.service

Authentication plugin ‘caching_sha2_password’ cannot be loaded

1
2
3
use mysql;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '12345678';
select Host,user,plugin,Authentication_string from user;

完美解决 ERROR2059(HY000):Authenticationplugincachingsha2_passwordcannotbeloaded 问题小洋人最 happy 的专栏-CSDN 博客_error2059

不可重复读和幻读的区别

  • 脏读:读取未提交的数据;
  • 不可重复读(update):前后多次读取,数据内容不一致;
  • 幻读(insert、delete):前后多次读取,数据总量不一致;
  • 快速理解脏读、不可重复读、幻读和 MVCC - 云+社区 - 腾讯云
    (1) 不可重复读是读取了其他事务更改的数据,针对 update 操作
    解决:使用行级锁,锁定该行,事务 A 多次读取操作完成后才释放该锁,这个时候才允许其他事务更改刚才的数据。
    (2) 幻读是读取了其他事务新增的数据,针对 insert 和 delete 操作
    解决:使用表级锁,锁定整张表,事务 A 多次读取数据总量之后才释放该锁,这个时候才允许其他事务新增数据。

SELECT IN(子查询)太慢问题

1
explain SELECT * FROM third_video_iqiyi WHERE  v_id in (SELECT v_id FROM third_video_iqiyi WHERE v_id < 10);

常见问题_20220608185021_2022-06-08-18-50-22
在表的整体数据量大的情况下,上面的 sql 基本无法执行。

优化方案

1
explain SELECT * FROM third_video_iqiyi a ,(SELECT v_id FROM third_video_iqiyi WHERE v_id < 10) b WHERE a.v_id = b.v_id;

常见问题_20220608184956_2022-06-08-18-49-57

0%