一、内存溢出

虚拟机栈和本地方法栈溢出:-Xss256k

package com.jedis;

import java.util.LinkedList;
import java.util.List; public class Demo1 {
private int len = 1; private void fun() {
len++;
fun();
} public static void main(String[] args) {
Demo1 t = new Demo1();
try {
t.fun();
} catch (Throwable e) {
System.out.println("Length = " + t.len);
e.printStackTrace();
}
} } /*
Length = 3257
java.lang.StackOverflowError
*/

栈溢出

Java堆溢出:-Xms5M -Xmx5M -XX:+PrintGCDetails -verbose:gc

package com.jedis;

import java.util.LinkedList;
import java.util.List; public class Demo1 { public static void main(String[] args) {
List<Object> list = new LinkedList<>();
int i = 0;
while(true) {
i++;
if(i%10000==0) System.out.println("i = " + i);
list.add(new Object());
}
//String[] strings = new String[1000000000];
} }

Java堆溢出

方法区和运行时常量池溢出:-XX:MaxMetaspaceSize=3M

package com.jedis;

import java.util.LinkedList;
import java.util.List; public class Demo1 { public static void main(String[] args) {
List<Object> list = new LinkedList<>();
} }
/*
Error occurred during initialization of VM
OutOfMemoryError: Metaspace
*/

方法区溢出

本地直接内存溢出:-Xmx10M -XX:MaxDirectMemorySize=10M

package com.jedis;

import java.lang.reflect.Field;

public class Demo1 {

    public static void main(String[] args) {
Field unsafeField = Unsafe.class.getDeclaredField()[0];
unsafeField.setAccessible(true);
Unsafe unsafeInstance = (Unsafe)unsafeField.get(null);
while(true) {
unsafeInstance.allocateMemory(1024*1024);
}
}
} /*
*/

直接内存溢出

二、垃圾收集器与内存分配策略

GC要做的事:

1、Where/Which?

2、When?

3、How?

where:堆/方法区(元数据空间)

which:引用计数法/可达性分析法

引用计数缺点:相互引用

A +1

B +1

C 0

A-->B

B-->A

A、B组成孤岛,但是两个在计数上不为0

python-引用计数法

---

可达性分析:

GC Roots

1、虚拟机栈引用的对象

2、方法区类属性引用的对象

3、方法区常量引用的对象

----

怎么回收?

标记-清除算法(Mark-Sweep):直接把可回收的标记后清除——>不连续内存碎片——>无法放下大对象

复制算法(Copying):区域一分为二,存活对象一一复制过来,然后一股脑的把另一个全部释放——>内存拷贝耗时、任何时候都有一半空间空着

标记-整理算法(Mark-Compact):存活对象按照某种顺序排列——>标记、移动耗时

分代收集算法:90%对象朝生夕死——>堆分为新生代(刚new的对象)、老年代(活过多少次GC过程提取到老年代)——>定制不同的GC算法

G1:JDK1.8后常用了——>把新生代、老年代分的更小

Eden:to survival:from survival

8:1:1

最新文章

  1. Ubuntu15.04YouCompleteMe插件安装
  2. MyEclipse创建Maven工程
  3. Markdown入门 学习
  4. push notification获取device token
  5. 利用springframework+javax.mail发邮件(普通邮件、带附件邮件、HTML格式邮件)
  6. &#39;&lt;&#39;, hexadecimal value 0x3C, is an invalid 问题解决
  7. 使用Java修改Windows注册表
  8. JIRA 6.3.6版本部署
  9. 提取html中的src 路径
  10. HDU 5433 Xiao Ming climbing
  11. Oracle 关于事物的描述
  12. 移动端Reactive Native轮播组件
  13. phpcms v9使用GET调用指定id文章内容、页面数据方法
  14. iPhone应用提交流程:如何将App程序发布到App Store?
  15. linux C连接mysql
  16. Secret of Success(成功的秘诀)
  17. 51nod1126(矩阵快速幂)
  18. linux CentOS 权限问题修复(chmod 777 -R 或者chmod 755 -R问题修复)
  19. python代码规范和命名规范
  20. Day3 -4.9!受到毕设的突然袭击,一脸蒙蔽,学习暂时停止,明晚继续

热门文章

  1. C++ 数组作为参数的传递
  2. thinkphp自动创建目录
  3. vue webpack打包后.css文件里面的背景图片路径错误解决方法
  4. 2018-2019-2-20175323 java实验五 网络编程与安全
  5. EnhanceFunc__增强函数集
  6. bash数组总结
  7. mac的终端运行ifconfig
  8. iOS开发系列-打印内存地址
  9. Ansible实现批量无密码登录
  10. Mysql优化-概述