• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

Recommended Posts

内存结构

1.程序计数器

2.虚拟机堆栈

3.本地方法堆栈

4.许多

5.方法区域

vue21hxa0vx4168.png

1、程序计数器

功能:记录下一条jvm指令的执行地址。

特点:

是线程私有的。

没有内存溢出。

2、虚拟机栈

每个线程运行所需的内存成为虚拟机堆栈。

每个堆栈由多个堆栈帧组成,这些堆栈帧对应于调用每个方法时占用的内存。

每个线程只能有一个活动堆栈框架,对应于正在执行的方法。

注意:

如果方法中的局部变量没有逃脱该方法的活动访问,则它是线程安全的。

如果一个局部变量引用一个对象并从方法的作用域中逸出,那么应该考虑线程安全。

栈内存溢出:

过多帧导致堆栈内存溢出。

由于堆栈大小导致堆栈内存溢出。

3、本地方法栈

当jvm调用一些本地方法时,需要为它们提供内存。

4、堆

堆堆

定义:new关键字创建的所有对象都使用堆内存。

特点:

它由线程共享,堆中的对象需要考虑线程安全。

有垃圾收集机制。

5、方法区

定义:

Java虚拟机有一个由所有Java虚拟机线程共享的方法区域。方法类似于传统语言中编译代码的存储区域,或者类似于操作系统进程中的“文本”段。它存储了每个类的结构,如运行时常量池、字段和方法数据,以及方法和构造函数的代码,包括类和实例初始化以及接口初始化中使用的特殊方法。方法是在虚拟机启动时创建的。尽管方法区域在逻辑上是堆的一部分,但一个简单的实现可能选择不对它进行垃圾收集或压缩。这个规范不需要方法区域的位置或者管理编译代码的策略。方法面积可以是固定大小,也可以根据计算需要扩大,如果不需要更大的方法面积也可以缩小。方法的内存不需要是连续的。Java虚拟机实现可以为程序员或用户提供方法区初始大小的控制,以及方法区大小可变时最大和最小方法区大小的控制。

组成:

xvwlpx32nxe4169.png

注意:方法区内存溢出。

1.在1.8之前,它会导致永久内存溢出。

2.1.8之后,元空间内存溢出。

运行时常量池

常量池是一个表,虚拟机指令可以从中找到诸如类名、方法名、参数类型、文字量等信息。被处决。

运行时常量池,常量池在*。类文件。当类被加载时,它的常量池信息会被放入运行时常量池,里面的符号地址会被改成实地址。

StringTable

特性:

常量池中的字符串只是符号,第一次使用时就变成了对象。

字符串池机制用于避免重复创建字符串对象。

字符串拼接的原理是StringBuilder (1.8)

字符串串联的原理是编译时优化

可以使用intern方法主动将不在字符串池中的字符串对象放入字符串池中。

1.8尝试将这个字符串对象放入字符串池。如果存在,就不会放入字符串池。如果没有,它将返回字符串池中的对象。

1.6尝试将这个字符串对象放入字符串池。如果有,就不放进去了。如果没有,它将复制这个对象,并将其放入字符串池,这将返回字符串池中的对象。

6、 直接内存

定义:

常见于NIO操作中,用于数据缓冲。

回收成本高,但读写性能高。

不接受JVM内存回收管理

分配和回收原理

不安全对象用来完成直接内存的分配和回收,回收需要主动调用freeMemory方法。

在bytebuffer的实现类中,Cleaner(虚拟引用)用于监视bytebuffer对象。一旦bytebuffer对象被垃圾回收,ReferenceHandler线程就会通过Cleaner的clean方法调用freeMemory来释放直接内存。

Link to comment
Share on other sites