Other

JVM内存区域

二、Java内存区域 1、Java内存结构   程序计数器 当前线程所执行字节码的行号指示器。若当前方法是native的,那么程序计数器的值就是undefined。 线程私有,Java内存区域中唯一一块不会发生OOM或StackOverflow的区域。 虚拟机栈 就是常说的Java栈,存放栈帧,栈帧里存放局部变量表等信息,方法执行到结束对应着一个栈帧的入栈到出栈。 线程私有,会发生StackOverflow。 本地方法栈 与虚拟机栈的作用是一样的,只不过虚拟机栈是服务 Java 方法的,而本地方法栈是为虚拟机调用 Native 方法服务的。 线程私有,会发生StackOverflow。 堆 Java 虚拟机中内存最大的一块,几乎所有的对象实例都在这里分配内存。 是被所有线程共享的,会发生OOM。 方法区 也称非堆,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。 是被所有线程共享的,会发生OOM。 运行时常量 是方法区的一部分,存常量(比如static final修饰的,比如String 一个字符串)和符号引用。 是被所有线程共享的,会发生OOM。 2、对象创建时堆内存分配算法 指针碰撞 前提要求堆内存的绝对工整的。 所有用过的内存放一边,没用过的放另一边,中间放一个分界点的指示器,当有对象新生时就已经知道大小了,指示器只需要像没用过的内存那边移动与对象等大小的内存区域即可。   空闲列表 假设堆内存并不工整,那么空闲列表最合适。 JVM维护一个列表 ,记录哪些内存块是可用的,当对象创建时从列表中找到一块足够大的空间划分给新生对象,并将这块内存标记为已用内存。  3、对象在内存中的存储布局 分为三部分: 对象头 包含两部分:自身运行时数据和类型指针。 自身运行时数据包含:hashcode、gc分代年龄、锁状态标识、线程持有的锁、偏向线程ID、偏向时间戳等 对象指针就是对象指向它的类元数据的指针,虚拟机通过这个指针来确定对象是哪个类的实例 实例数据 用来存储对象真正的有效信息(包括父类继承下来的和自己定义的) 对齐填充 JVM要求对象起始地址必须是8字节的整数倍(8字节对齐),所以不够8字节就由这部分来补充。 4、对象怎么定位 如下两种,具体用哪种有JVM来选择,hotspot虚拟机采取的直接指针方式来定位对象。

Centos8下docker自动化安装脚本

vi yum.sh vi yum.sh #! /bin/bash echo ------- 时区配置-------- sudo yum install -y chronysystemctl start chronydsudo systemctl enable chronydsed -i 's/pool 2.centos.pool.ntp.org iburst/#&/' /etc/chrony.confsed -i '$a\server ntp.aliyun.com iburst' sed -i '$a\server cn.ntp.org.cn iburst' systemctl restart chronyd.service mv /etc/localtime{,.bak} ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime echo ------- 时区配置完成-------- yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine yum install -y yum-utils yum-config-manager \ --add-repo \ http://mirrors.

Qt - 内存回收

玩个按钮(设置父对象) QPushButton是Qt中常用的一个类 QPushButton* btn = new QPushButton; //show和setparent同时调用会让按钮显示在窗口中间 btn->show(); //显示控件 btn->setParent(this); //将小部件的父组件设置为parent,小部件被移动到其父部件的(0,0)位置 btn->setText(第一个按钮); ​ //通过构造函数指定父控件会让窗口以子控件的大小进行显示 QPushButton* btn2 = new QPushButton(第二个按钮,this); //移动按钮到指定位置 btn2->move(100,0); //重新调整窗口大小 this->resize(640,480); //设置窗口标题 this->setWindowTitle(第一个窗口); Qt内存回收机制 一、简介 Qt内存管理机制:Qt 在内部能够维护对象的层次结构。对于可视元素,这种层次结构就是子组件与父组件的关系;对于非可视元素,则是一个对象与另一个对象的从属关系。在 Qt 中,在 Qt 中,删除父对象会将其子对象一起删除。 C++中delete 和 new 必须配对使用(一 一对应):delete少了,则内存泄露,多了麻烦更大。Qt中使用了new却很少delete,因为QObject的类及其继承的类,设置了parent(也可在构造时使用setParent函数或parent的addChild)故parent被delete时,这个parent的相关所有child都会自动delete,不用用户手动处理。但parent是不区分它的child是new出来的还是在栈上分配的。这体现delete的强大,可以释放掉任何的对象,而delete栈上对象就会导致内存出错,这需要了解Qt的半自动的内存管理。另一个问题:child不知道它自己是否被delete掉了,故可能会出现野指针。那就要了解Qt的智能指针QPointer。 二、关联图 在Qt中,最基础和核心的类是:QObject,QObject内部有一个list,会保存children,还有一个指针保存parent,当自己析构时,会自己从parent列表中删除并且析构所有的children。 三、详解 1、内存管理 (1)QObject及其派生类的对象,如果其parent非nullptr,那么其parent析构时会析构该对象。 (2)父子关系:父对象、子对象、父子关系。这是Qt中所特有的,与类的继承关系无关,传递参数是与parent有关(基类、派生类,或父类、子类,这是对于派生体系来说的,与parent无关)。 2、内存问题例子 #include <QPushButton> ​ Widget::Widget(QWidget *parent) { QLabel *label = new QLabel(Hello Qt!); label->show(); } 分析:label 既没有指定parent,也没有对其调用delete,所以会造成内存泄漏。 改进方式: 分配对象到栈上而不是堆上 #include <QLabel> ​ Widget::Widget(QWidget *parent) { QLabel label(Hello Qt!

linux的su/cd/ls命令

[lemon@localhost ~]$lemon:用户名@:不用管,没有意义localhost:服务器名称$:普通用户 ~:当前用户的家目录[lemon@localhost root]$ cd ~[lemon@localhost ~]$ pwd/home/lemon  su命令su :不退出登录情况下,切换用户示例:[lemon@localhost ~]$ su root ----->切换超级管理员password:(输入密码完成后,没有错误提示,基本上证明操作么有问题)[root@localhost lemon]#   cd命令cd:切换路径[root@localhost lemon]# cd ./ ----->当前目录[root@localhost lemon]# cd ../ ----->返回上一层目录[root@localhost lemon]# cd / ----->切换到根目录[root@localhost lemon]# cd home ----->切换到home目录 区分:cd/home---->cd/lemon 得到 /lemoncd/home---->cd lemon 得到 /home/emon绝对路径:/ ,从根目录开始寻找相对路径:没有/,从当前路径开始寻找    ls命令ls(Ls):显示当前目录下所有文件[lemon@localhost ~]$ ls ------>显示当前目录下所有可见文件[lemon@localhost ~]$ ls -a ------>显示当前目录下所有文件,包含隐藏文件,隐藏文件带点.[lemon@localhost ~]$ ls -l ------>(简写ll,小写ll)显示当前目录下所有可见文件的属性[lemon@localhost ~]$ ll -a ------>(简写)显示当前目录下所有,包含隐藏文件的属性  

Linux-安装ifconfig

镜像下载、域名解析、时间同步请点击阿里云开源镜像站 ifconfig 命令可以用于查看、配置、启用或禁用指定的网络接口,还可以用来配置网卡的IP地址、掩码、广播地址、网关等,功能很丰富 功能虽然丰富,但是如果你没有安装呢? 嘿嘿嘿 如果没有安装ifconfig管理命令的话,直接运行ifconfig命令,会提示错误 :-bash: ifconfig: command not found 此时我们查看 /sbin 目录,会发现他是没有 ifconfig 相关文件的 ls | grep ifconfig # 查看不到相关文件 自然而然的想到,使用yum安装 yun install ifconfig -y 可以看到它给我报错提示我找不到这个包 为什么??? 我们再通过yum 命令的search选项来对包进行再次搜索 yum search ifconfig # search:可以根据软件的名称或者是描述的关键字来进行搜索包,可以查找显示出相关的软件有哪些 此时我们可以看到找到了一个相关包net-tools.x86_64,并且后面还有补充说明,说明这个一个基本的网络管理工具包 原来ifconfig管理命令的软件包的名称不是ifconfig,而是net-tools.x86_64,那我们换一个名称再次安装试一下 yum install net-tools.x86_64 -y 可以看到,已经按照成功 使用ifconfig看一下吧!嗯~,结果很完美 查看一下 /sbin 目录里面有没有相关文件,果然现在已经有了 本文转自:https://blog.csdn.net/weixin_51800059/article/details/122582723

一道有趣的大厂测试面试题,你能用 Python or Shell 解答吗?

⬇️ 点击“下方链接”,提升测试核心竞争力! >>更多技术文章分享和免费资料领取原文链接 本文是测试开发工程师Venn同学面试某互联网名企遇到的一道面试题目,首发于Testerhome社区,引发了有趣的讨论和解答,供各位测试同学参考。链接:https://testerhome.com/topics/18337 一道有趣的测试面试题目 题目:在A文件夹下有多个子文件夹(a1、b1、c1),每个子文件夹下有好几张jpg图片,要求写一段代码(用PythonorShell),把这些图片全部拷贝并存在B文件夹下。 一小撮测试工程师的讨论 聪明的Cookie同学:考点就是如何遍历一个文件夹下的文件,需要考虑的是文件路径深度,需要用到递归。 诚实的黑山老妖同学:我觉得对我来说,难点是操作文件的方法,之前没怎么用过,递归遍历啥的倒是小问题。 经验老道的剪烛同学:如果拿这个题目面试测试工程师,这个肯定还需要你提问的(考你需求分析),不仅仅是说写个脚本,等你写完了(考你编程熟悉),还会让你针对你写的代码进行测试(考你用例设计),都是套路。 爆炸的hellohell同学:我再想,如果我碰到这个问题,是否能当场给出正确答案?估计不成,因为API全忘掉了。确实记性不好。如果给我个本儿,给上网机会,多费点时间,能搞出来;甚至用了递归,生成器,精简了代码(篡成一行),做了判断。 jpg是个目录咋办?不同目录下文件同名咋办?以及其他 但前提是你不参考任何东西就写代码。但实际工作中好像这种人不多;so,我只能原地爆炸了。不过打心里还是觉得用Shell解决这个问题比较好些。 参考答案 Python解答(by煎饼果子) # -*- coding: utf-8 -*- import os,shutil def movefile(srcfile,dstfile): fpath,fname=os.path.split(srcfile) if os.path.isfile(os.path.join(dstfile,fname)): print(%s exist!%str(os.path.join(dstfile,fname))) elif not os.path.isfile(srcfile): print(%s not exist!)%(srcfile) else: fpath,fname=os.path.split(dstfile) if not os.path.exists(fpath): os.makedirs(fpath) shutil.move(srcfile,dstfile) def getfile(path): paths = [] for root, dirs, files in os.walk(path): for file in files: paths.append(os.path.join(root,file)) return paths def main(): path = /path/A pathto = /path/B paths = getfile(path) for pathfrom in paths: print(pathfrom) movefile(pathfrom,pathto) if __name__ == '__main__': main() Java解答(byLucas)

redis

最近操作redis 1、登录redis  redis-cli -h 127.0.0.1 -p 8531 -a *** 2、动态修改配置  config set    3、redis持久化  save 可以关闭rdb持久化;  appendonly可以关闭aof持久化 4、遇到问题 Unrecoverable error: corrupted cluster config file.  解决方法:  http://blog.trumandu.top/2017/06/01/RedisCluster-%E9%9B%86%E7%BE%A4%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E6%8D%9F%E5%9D%8F%E4%BF%AE%E5%A4%8D/   

Linux cpuspeed 命令

Linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与之前的DOS命令类似。linux命令在系统中有两种类型:内置Shell命令和Linux命令。本文主要介绍Linux cpuspeed 命令。 原文地址:Linux cpuspeed 命令

通过redis键空间通知实现日程的提醒通知

什么是延迟任务? 顾明思议,我们把需要延迟执行的任务叫做延迟任务。 延迟任务的使用场景有以下这些: 红包 24 小时未被查收,需要延迟执退还业务; 每个月账单日,需要给用户发送当月的对账单; 订单下单之后 30 分钟后,用户如果没有付钱,系统需要自动取消订单。 新增日程事项选择某个时间后,需要到点或提前多久,或每天,或每周等,发送当前日程通知。 等事件都需要使用延迟任务。 使用 Redis 实现延迟任务的方法大体可分为两类: 和通过键空间通知的方式。 通过 zset 数据判断的方式。  1.通过键空间通知 默认情况下 Redis 服务器端是不开启键空间通知的,需要我们通过 config set notify-keyspace-events Ex 的命令手动开启, 开启键空间通知后,我们就可以拿到每个键值过期的事件,我们利用这个机制实现了给每个人开启一个定时任务的功能,实现代码如下: import org.springframework.stereotype.Component; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; /* * redis数据连接池的工具类* 这个有点老 * @author lcl */ @Component public class JedisUtils { private static JedisPool pool; static { //读取配置文件 String host = localhost; //获取端口号 int port = Integer.

liver server能运行 nginx 报错图片路径到根目录

问题 Ngnix 部署项目 代码为ES6 编写经过打包,liver server能正常运行 但是按照常规的 location /xxx 方式会图片路径请求不到,报错图片路径到根目录。 解决方法 多开一个server 81 设置root 为项目路径 81代理转发到80 设置 /xxx/ proxy localhost:81/ 特别注意 /xxx/ !