分类 Default 下的文章

一、文档/博客

Google的工程实践文档

csapp作者讲课视频《深入了解计算机系统

MySQL 优化实施方案

mysql的优化器执行过程

mysql之优化器、执行计划、简单优化

使用ffmpeg转码m3u8并播放

技术博客-FeelTouch

二、命令

1.代理启动谷歌浏览器

google-chrome-stable --proxy-server="socks5:127.0.0.1:1080"

2.目录忽略移动

当前目录下有a、b、c、d四个文件,在当前目录下新建new目录,并且将a、b、c三个文件移动到new中
find -maxdepth 1 \! -name d \! -name . -exec mv {} new \;

3.端口占用

window端口占用解决

  • 获取端口占用进程的pid:netstat -aon|findstr "8087"
  • 根据pid杀进程:taskkill /f /pid 24336

    linux端口占用解决

  • 查看8080这个端口是否被使用:netstat -lnt | grep 8080
  • 根据端口查看进程信息:lsof -i : 8080

    4.查看目录内容大小

    sudo du --max-depth=1 -h /var/lib/docker/

    5.杀进程

    killall 进程名
    pkill 进程名
    sudo kill -9 $(ps -ef|grep 软件名|gawk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ')
    sudo kill -9 $(pidof 软件名)

    6.添加字体

    down font:https://developer.harmonyos.com/cn/docs/design/des-guides/font-0000001157868583
    解压添加到/usr/share/fonts/TTF目录中
    刷新字体:fc-cache -fv

    How to get rid of - package "num not fully installed or removed"

    dpkg --purge [package name here]

三、工具

  • markdown表格处理:https://tableconvert.com/
  • Gravatar头像 镜像地址:七牛云 ref
  • 删除git本地缓存:git rm -r --cached .
  • 删除系统无用包:sudo pacman -R $(pacman -Qdtq)
  • 清除已下载的安装包:sudo pacman -Scc

一、阿里云账号相关设置

  • 第一步:登录阿里云控制台并创建子账号:https://usercenter.console.aliyun.com/#/manage/ak
  • 第二步:进入跳转页面填上 登录名称、显示名称、勾选编程访问。最后点击确定。
  • 第三步:切记需要在本地新建一个记事本保存AccessKey ID和AccessKey Secret信息。
  • 可选步骤:

    • 设置用户组功能(可以方便管理多用户权限,如果只有一个用户的话也可以忽略本步骤),填入组相关信息后通过手机验证即可;
    • 设置用户组权限:在添加组成员功能里添加第二步新建的用户;添加SMS权限
  • OK。

- 阅读剩余部分 -

不要钱才怪
  • 1.How CPU executes a program (video-注意看最下层字幕)
    {dplayer src="https://cdn.shafish.cn/video/m3u8/How-CPU-executes-a-program/Fetch-Decode-Execute%20Cycle.en.m3u8"/}

  • 2.Boolean Logic & Logic Gates: Crash Course Computer Science #3(中文字幕)

{dplayer src="https://cdn.shafish.cn/video/m3u8/booleanLogicGates/cn/booleanLogicGates-cn.m3u8"/}


  • 3.Boolean Logic & Logic Gates: Crash Course Computer Science #3(英文字幕)

{dplayer src="https://cdn.shafish.cn/video/m3u8/booleanLogicGates/en/booleanLogicGates-en.m3u8"/}


  • 4.How Computers Calculate - the ALU: Crash Course Computer Science #5(中文字幕)

{dplayer src="https://cdn.shafish.cn/video/m3u8/howComputersCalculate-TheALU/cn/howComputersCalculate-TheALU-cn.m3u8"/}


  • 5.How Computers Calculate - the ALU: Crash Course Computer Science #5(英文字幕)

{dplayer src="https://cdn.shafish.cn/video/m3u8/howComputersCalculate-TheALU/en/howComputersCalculate-TheALU-en.m3u8"/}


- 阅读剩余部分 -

YGC:在堆中的新生代中进行的垃圾回收操作。也叫Minor GC。

怎么判断一个对象可以进行垃圾回收

  • 首先肯定得知道对象被ygc了多少次。Java语言的开发人员在Java对象头中进行了相关的设置,准确来说是在对象头中的mark work中进行了设置。 点击这里查看markOop.hpp


来看第44行中的说明:

  • unused:Java对象中预留给未来的25位
  • hash:对象的hash值,31位
  • age:gc次数,4位
  • biased_lock:偏向锁标识(只有一个线程访问时,不用每次都获取锁),配合lock使用,1位
  • lock:对象的锁级别,2位。unlocked(无锁)(0 01)、偏向锁(1 01)、locked(轻量级锁)(00)、monitor(重量级锁)(10)、marked(GC标记)(11)

上面5个属性再加上一个unused,一共占了64位,也就是8个字节,这些在64位系统下的配置。

可以看到age明确表明了只占有4位长度(0.5个字节),能存0~15的值。然后发现通过-XX:MaxTenuringThresholdjvm命令对age值进行调整,默认为15。

记录

在网上看到过设置MaxTenuringThreshold大于15的情况。疑问:设置的MaxTenuringThreshold参数是否you效??

参考:
https://stackoverflow.com/questions/13543468/maxtenuringthreshold-how-exactly-it-works
https://support.oracle.com/knowledge/Middleware/1283267_1.html

使用说明

发生OOM的情况一般都是因为程序中存在大对象,如果大对象存在是合理的,则说明程序需要的内存不足够。
而jprofiler就是一款可以根据dump信息检查程序OOM异常的软件。

jprofiler安装

idea插件搜索jprofiler安装,并去jprofiler官网下载软件:https://www.ej-technologies.com/products/jprofiler/overview.html
OK

解决思路

第一步:把jvm内存调大

VM options:

// 按倍调整
-Xms2048m -Xmx2048m

运行程序观察,如果在大内存下运行依然存在OOM问题,则说明是程序代码出现了问题。

第二步:定位OOM代码

    1. 调整对应的vm参数并dump出异常。

      //把jvm内存调小,让程序提前OOM。
      -Xms1m -Xmx4m -XX:+HeapDumpOnOutOfMemoryError
    1. 运行程序生成线程执行信息文件
      使用了dump命令,当运行main方法后,除了在控制台输出Exception外还会在根项目路径下生成一个java_pid.hprof文件,里面保存了程序线程执行的内容。
    1. 使用jprofiler分析
      本地安装完成jprofiler软件后,可以直接双击打开项目根路径下的java_pidxx.hprof文件即可。
      我们需要关心的有:biggest objects和thread dump这两个主要信息。

biggest objects中我们可以知道项目存在哪些大对象,而从thread dump可以知道哪行代码发生了OOM(需要的就是这个)。

Dump命令可以捕获我们指定的error,只需要在-XX:指定即可。

例子

    1. 编写一个让内存溢出的main线程程序,并在设置jvm参数后运行

      /**
       * 设置堆内存溢出
       */
      public class OOMTest {
        public static void main(String[] args) {
         List list = new ArrayList<String>();
         int count = 0;
         try{
             while (true) {
                 list.add(new OOMTest());
                 count += 1;
             }
         } catch (Error error) {
             System.out.printf("count= "+ count);
         }
        }
      }

    1. 在edit configurations中设置vm参数

      -Xms1m -Xmx4m -XX:+HeapDumpOnOutOfMemoryError

    1. 运行程序,生成dump文件


可以看到count在while循环第106711次后发生了OOM,并生成了java_pid3652.hprof文件。

    1. jprofiler使用
      打开hprof文件后点击大对象可以看到一个很大的对象类型:ArrayList

点击thread dump后选择我们运行的main线程可以看到,oom溢出定位到第15行代码中。(的确是发生在第15行)

over

还可以使用-XX:+PrintGCDetails命令打印输出GC垃圾回收信息,查看gc回收的过程。