JVM垃圾回收机制
垃圾回收机制我们前面提到,Java会自动管理和释放内存,它不像C/C++那样要求我们手动管理内存,JVM提供了一套全自动的内存管理机制,当一个Java对象不再用到时,JVM会自动将其进行回收并释放内存,那么对象所占内存在什么时候被回收,如何判定对象可以被回收,以及如何去进行回收工作也是JVM需要关注的问题。 对象存活判定算法首先我们来套讨论第一个问题,也就是:对象在什么情况下可以被判定为不再使用已经可以回收了?这里就需要提到以下几种垃圾回收算法了。 引用计数法我们知道,如果我们要经常操作一个对象,那么首先一定会创建一个引用变量: 1234//str就是一个引用类型的变量,它持有对后面字符串对象的引用,可以代表后面这个字符串对象本身String str = "lbwnb";//str.xxxxx... 实际上,我们会发现,只要一个对象还有使用价值,我们就会通过它的引用变量来进行操作,那么可否这样判断一个对象是否还需要被使用: 每个对象都包含一个 引用计数器,用于存放引用计数(其实就是存放被引用的次数) 每当有一个地方引用此对象时,引用计数+1 当引用失效( 比如离 ...
JVM内存区域
JVM内存区域在传统的C/C++开发中,我们经常通过使用申请内存的方式来创建对象或是存放某些数据,但是这样也带来了一些额外的问题,我们要在何时释放这些内存,怎么才能使得内存的使用最高效,因此,内存管理是一个非常严肃的问题。 比如我们就可以通过C语言malloc函数动态申请内存,并用于存放数据,而在Java中,这种操作实际上是不允许的,Java只支持直接使用基本数据类型和对象类型,至于内存到底如何分配,并不是由我们来处理,而是JVM帮助我们进行控制,这样就帮助我们节省很多内存上的工作,虽然带来了很大的便利,但是,一旦出现内存问题,我们就无法像C/C++那样对所管理的内存进行合理地处理,因为所有的内存操作都是由JVM在进行,只有了解了JVM的内存管理机制,我们才能够在出现内存相关问题时找到解决方案。 内存区域划分既然要管理内存,那么肯定不会是杂乱无章的,JVM对内存的管理采用的是分区治理,不同的内存区域有着各自的职责所在,在虚拟机运行时,内存区域如下划分: 我们可以看到,内存区域一共分为5个区域,其中方法区,堆和直接内存是所有线程共享的区域,随着虚拟机的创建而创建,虚拟机的结束而销毁,而 ...
JVM启动流程(JDK8)
JVM启动流程(JDK8)JVM的启动入口是位于jdk/src/share/bin/java.c的JLI_Launch函数,其定义如下: 12345678910111213intJLI_Launch(int argc, char ** argv, /* main argc, argc */ int jargc, const char** jargv, /* java args */ int appclassc, const char** appclassv, /* app classpath */ const char* fullversion, /* full version defined */ const char* dotversion, /* dot version defined */ const char* pname, /* program name * ...
西电计科微机原理实验四
西电计科微机原理实验四实验要求 流水灯实验:利用8255的A口、B口、C口循环点亮发光二极管。 根据输入控制灯的亮灭 在完成(1)基础上,增加通过读取开关控制流水灯的循环方向和循环方式。 跟上一次实验基本相同,换了个芯片,然后控制的范围从八颗发光二极管变为了十六颗发光二极管 基础版简单实现了功能1和2,全1左移,全0右移 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102COM_ADD EQU 0273H PA_ADD EQU 0270H PB_ADD EQU 0271H PC_ADD EQU 0272H _STACK SEGMENT STACK DW 100 DUP(?) _STACK ENDS _DATA SEGMENT WORD PUB ...
OpenSSL实现单向认证
OpenSSL实现单向认证OpenSSL的安装OpenSSL采用C语言作为开发语言,这使得它具有优秀的跨平台性能,OpenSSL支持: Linux Windows Mac等常见操作系统OpenSSL github地址 win和mac需要单独去下OpenSSL客户端,网上也有很多教程,可以自己去找找看 Linux系统自带OpenSSL库,一般不需要下载安装,我会使用KALI Linux进行本次实验 查看下openssl的版本: 简单通信过程下面以最常见的单向认证为例,简述一下通信过程: 客户端向服务器发送请求 服务器将包含公钥的证书通过明文发送给客户端 客户端通过根证书验证服务器证书是否有效 如果有效,客户端生成一个随机密钥,也叫对称加密密钥,使用服务器的公钥进行加密传输 服务器通过私钥解密客户端传输的对称加密密钥 这时只有服务器和客户端知道这个对称加密密钥,双方可以进行对称加密传输 颁发证书通过vim /usr/lib/ssl/openssl.cnf修改配置文件,这里修改了默认文件夹、私钥名、证书名。 在默认文件夹创建所需的目录和文件1234mkdir -pv s ...
对自己的博客网站进行DOS攻击(脚本小子□_□)
对自己的博客网站进行DOS攻击(脚本小子□_□)先说明一点,别对别人的网站进行ddos/dos攻击(dos攻击一般短时间攻击不下来),这是违法的,很多都有自动报警机制,本篇博客仅用于学习,请勿用于非法用途 安装kaili Linux进入KALI官网,下载iso镜像文件 vmware新建虚拟机,选择自定义 点击下一步 点击下一步选择稍后安装操作系统,点击下一步选择Debian系统,版本根据自己的kali版本来,我这里就选最新的Debian12,点击下一步虚拟机名称和存储位置根据自己情况来,点击下一步处理器配置根据自己电脑的配置来,点击下一步内存也是根据自己的使用情况来,点击下一步点击下一步点击下一步点击下一步点击下一步点击下一步点击下一步点击自定义硬件导入下载好的ISO文件,关闭后点击完成即可 剩下启动后的配置就比较简单了,根据自己情况来即可 安装完成后打开是这样的: 换源+更新 进入root权限1sudo su 输入密码后,换源1sudo vim /etc/apt/sources.list 部分国内源:123456789101112131415161718192021官方源deb ...