为了账号安全,请及时绑定邮箱和手机立即绑定

请教一下jvm的内存模型?怎么栈溢出,堆溢出?gc?真的用到过没?

/ 猿问

请教一下jvm的内存模型?怎么栈溢出,堆溢出?gc?真的用到过没?

慕仰1329654 2019-11-11 14:10:48

jvm的内存模型?怎么栈溢出,堆溢出?gc?真的用到过没


查看完整描述

3 回答

?
跃然一笑

但是在平常编程中,肯定经常遇到OOM问题。
jvm的内存模型,简单来说就是堆栈结构,实际上内存的划分很复杂。推荐《深入java虚拟机》来入门了解。
栈溢出和堆溢出,顾名思义,就是栈和堆上的内存不够用了,就抛出OOM异常呗。可以通过调整参数来控制堆栈的内存大小:-Xmn -Xmx
GC就是针对堆,栈,方法区的垃圾回收行为。这些问题还是要看书的,打字打死也说不完。

查看完整回答
反对 回复 2019-11-16
?
DIEA

栈是程序自动分配内存的,一般有2M,视情况而定,当超过了这一限制就会产生栈溢出,而栈是程序员分配的
ls:列目录。 用法:ls或ls dirName,参数:-a显示所有文件,-l详悉列出文件。 mkdir:建目录。 用法:mkdir dirName,参数:-p建多级目录,如:mkdir a/b/c/d/e/f -p mount:挂载分区或镜像文件(.iso,.img)文件。 用法: a.磁盘分区:mount dev...

查看完整回答
反对 回复 2019-11-16
?
www说

栈溢出是由于C语言系列没有内置检查机制来确保复制到缓冲区的数据不得大于缓冲区的大小,因此当这个数据足够大的时候,将会溢出缓冲区的范围。

堆溢出的产生是由于过多的函数调用,导致调用堆栈无法容纳这些调用的返回地址,一般在递归中产生。堆溢出很可能由无限递归(Infinite recursion)产生,但也可能仅仅是过多的堆栈层级。

int f(int x){int a[10];

a[11] = x;}这个就是栈溢出,x被写到了不应该写的地方。在特定编译模式下,这个x的内容就会覆盖f原来的返回地址。也就是原本应该返回到调用位置的f函数,返回到了x指向的位置。一般情况下程序会就此崩溃。但是如果x被有意指向一段恶意代码,这段恶意代码就会被执行。

堆溢出相对比较复杂,因为各种环境堆的实现都不完全相同。但是程序管理堆必须有额外的数据来标记堆的各种信息。堆内存如果发生上面那样的赋值的话就有可能破坏堆的逻辑结构。进而修改原本无法访问的数据。

int f(char *s, int n)

{

char a[10];

memcpy(a, s, n);

...

这个是栈溢出比较真实一点的例子,如果传入的数据长度大于10就会造成溢出,进而改变f的返回地址。只要事先在特定地址写入恶意代码,代码就会被执行。


查看完整回答
反对 回复 2019-11-16
  • 3 回答
  • 0 关注
  • 35 浏览
我要回答

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信