首页
学习
活动
专区
圈层
工具
发布

ThreadLocal内存泄漏 强引用vs弱引用

强引用vs弱引用Java中一个有四种引用类型,强引用、弱引用、软引用、虚引用。这里讨论一下强引用和弱引用,软引用和虚引用并不在讨论范围之内。...} public static void removeUser(){ tl.remove(); }}先看上面的代码,我们把tl引用的ThreadLocal对象的地址看作是0x123...每当一个线程使用saveUser方法时,都会在自己线程的ThreadLocalMap中新增一个Entry(key,value),key引用0x123,value引用着0x456。...但是由于tl是UserHolder类的静态变量,只要这个类不被卸载,那么tl一直持有着对0x123的强引用。...的强引用就没了,但是我们忘记了对使用remove方法,此时弱引用的好处就出来了,下一次gc发生时,由于ThreadLocalMap对0x123的引用是弱引用就会被回收,那么这个线程中的ThreadLocalMap

31321

java开发操作系统:一个程序向另一个程序伸出的咸猪手

接着我们在本地目录创建一个新文件叫crack.c,其内容如下: void main() { char *p = (char*)0x123; p[0] = 'c'; p[1] =...于是在crack.c中,它对内存地址为0x123的地方写入字符串”crack”,那就意味着对hlt加载用户进程的内存空间写入对应字符串!...完成上面代码后,我们在java项目中,增加代码,一是用来编译crack进程,而是把crack代码写入虚拟磁盘。...在OperatingSystem.java中,将代码做如下添加: public void makeFllopy() { writeFileToFloppy("kernel.bat", false...此时我们可以看到,运行hlt命令,执行用户进程的控制台窗口居然输出了字符串”crack”,而这个字符串正是crack.c在执行时,写入地址0x123的字符串。

70140
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    《Linux内核分析》之计算机是如何工作的 实验总结

    寻址命令 movl %eax,%edx edx =eax; 解释:register mode 寄存器寻址 本句含义:将eax寄存器里的内容放到edx寄存器中,相当于后面的edx =eax movl $0x123...,%edx edx = 0x123; 解释: immediate  立即寻址 $+16进制的数字即:立即数是以¥开头的数值。...和内存无关 本句含义:将数值直接放在edx中,相当于后面的edx = 0x123 movl 0x123,%edx edx=*(int32_t*)0x123; 解释: direct 直接寻址 直接访问一个指定的内存地址的数据...无$,表一个地址 本句含义:将内存地址16进制的123所指向的内存数据放到edx中,相当于后面 edx=*(int32_t*)0x123即c语言中将数值强制转换为32位int变量的指针,在用一个*的指针取其指向的值

    1.3K10

    深入理解计算机系统(3.3)------操作数指示符和数据传送指令

    因此指令 pushl %ebp 等价于下面两条指令:   subl  $4,%esp   movl %ebp,(%esp)   上图所示,当 %esp 为0x108,%eax为0x123时,执行指令 pushl...首先 %esp 会减4,得到0x104,然后会将 0x123 存放到存储器地址 0x104处。   将一个双字值从栈顶移出,首先要从栈顶位置读出数据,然后将栈指针加4。...因此指令 popl %eax 等价于下面两条指令:   movl (%esp),%eax   addl $4,%esp   上图所示,先从存储器中读取值 0x123,再写到寄存器 %edx中,然后寄存器...注意值0x123仍然会保存在存储器0x104中,直到被覆盖(比如被另一条入栈操作覆盖)。无论如何,%esp 指向的地址总是栈顶,任何存储在栈顶之外的数据都认为是无效的。

    1.7K51
    领券