博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java虚拟机读书笔记1——内存区域划分
阅读量:5285 次
发布时间:2019-06-14

本文共 1142 字,大约阅读时间需要 3 分钟。

Java 和 C++之间有一堵墙,墙里的人想出来,墙外的人想进去,这堵墙就是内存分配与垃圾回收(说实话,之前主要用c++,从来不想进去,在美国的一家小公司要用java,不进去也不行了)

1 内存区域的划分,java内存区域的划分远比c++要复杂的多, c++ 中也就分成: 栈 堆 代码区域 数据区域 静态全局区域(根据是否初始化还能再分成两类) 

1.1 程序计数器:每个线程分配一个计数器,计数器中保存着当前线程运行的程序地址(可能是函数的静态下标,也可能是程序字节码地址)

1.2 Java虚拟机栈:存储局部变量,函数内声明的变量,int double string 指向对象的引用等等

1.3 本地方法栈:当java需要调用其他语言编写的程序时,需要使用关键字native修饰一个方法,这个方法称为本地方法,本地方法的地址存储在本地方法栈中

1.4 Java堆:划分为new generation 和old generation;

new generation 中保存是生命周期较短的小对象,在minor GC过程中就会被回收,new generation 将80%的内存划分为Eden区域, 另划分两个区域各自占10% 叫做survivor 区域。新创建出来的对象放在Eden中,GC后活下来的对象移动到survivor 中

old generation 长声明周期的对象 

一次fullGC的过程:创建太多对象 ->Eden内存不足 -> 对象移动到old generation ->old 满了->full GC

1.5 方法区: 存储类信息 常量 静态变量,也叫permnent generation

1.6 运行时常量池:存放字面值与符号引用

1.7 直接内存:java虚拟机以外的内存,用于与外界进行交互

 

2 将每一块内存搞爆的方法:

1)将堆搞爆的方法:

List<String> li = new ArrayList<String>();

while(true) li.add(new String());

2) 将栈搞爆,递归函数地址存在栈中

class OOM {

  private int c = 1;

  public void cur() {

       c++; cur();

      }

     main() {

         cur();

     }

}

3) 将常量区域搞爆:

List<String> li = new ArrayList<String>();

int i = 0;

while(true) li.add(String.valueOf(i++).intern());

 

转载于:https://www.cnblogs.com/jiasenhuo/p/9644354.html

你可能感兴趣的文章
性能调优攻略
查看>>
ie6解决png图片透明问题
查看>>
瞬间的永恒
查看>>
2019-8-5 考试总结
查看>>
JS中实现字符串和数组的相互转化
查看>>
web service和ejb的区别
查看>>
Windows Azure Cloud Service (29) 在Windows Azure发送邮件(下)
查看>>
微信上传素材返回 '{"errcode":41005,"errmsg":"media data missing"}',php5.6返回
查看>>
div或者p标签单行和多行超出显示省略号
查看>>
Elasticsearch 滚动重启 必读
查看>>
Hadoop基本概念
查看>>
java.util.zip压缩打包文件总结一:压缩文件及文件下面的文件夹
查看>>
浅说 apache setenvif_module模块
查看>>
MySQL--数据插入
查看>>
重新学习python系列(二)? WTF?
查看>>
shell脚本统计文件中单词的个数
查看>>
SPCE061A学习笔记
查看>>
sql 函数
查看>>
hdu 2807 The Shortest Path 矩阵
查看>>
熟悉项目需求,要知道产品增删修改了哪些内容,才会更快更准确的在该项目入手。...
查看>>