一、内存溢出

虚拟机栈和本地方法栈溢出:-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

JVM实战的更多相关文章

  1. 从0开始带你成为JVM实战高手(百度网盘)

    狸猫技术窝<从0开始带你成为JVM实战高手> 之前写过几篇 JVM 相关的文章,最近复盘的时候,发现狸猫技术窝<从0开始带你成为JVM实战高手>真的不错,然后就在网上找了一下( ...

  2. JVM实战调优(空格引发的服务异常)

    JVM实战调优 问题描述 某一个项目中有一个文字转语音的服务,使用的是科大讯飞的语音转换服务,需要调用三方服务.因其转换服务是一个耗时操作,官方给的demo使用的是 WebSocket 进行数据转换操 ...

  3. jvm实战-基本类型占多少内存

    jvm内存占用模型 对象的内存结构 对象头 Header 包含两部分数据Mark Word和Kclass: Mark Word:存储对象自身的运行时数据,如hashCode.GC分代年龄.锁状态标志. ...

  4. jvm实战-jvm调优

    jvm调优 jvm调优主要是内存管理方面的调优,包括各个代的大小,GC策略等. 代大小调优 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内 ...

  5. JVM实战---类加载的过程

    任何程序都需要加载到内存才能与CPU进行交流 同理, 字节码.class文件同样需要加载到内存中,才可以实例化类 ClassLoader的使命就是提前加载.class 类文件到内存中 在加载类时,使用 ...

  6. JVM实战篇

    1.1 JVM参数 1.1.1 标准参数 -version -help -server -cp 1.1.2 -X参数 非标准参数,也就是在JDK各个版本中可能会变动 -Xint 解释执行 -Xcomp ...

  7. jvm 实战

    https://blog.csdn.net/neutrojan/article/details/50532590# 1.ps -ef |grep java 找出最耗性能的JAVA进程2.top -Hp ...

  8. 从零开始带你成为JVM实战高手

    专栏大纲 1.核心gc 内存回收以及提前设置内存大小.

  9. 一篇年薪60万的JVM性能调优文章

    JVM 调优概述 性能定义 吞吐量 - 指不考虑 GC 引起的停顿时间或内存消耗,垃圾收集器能支撑应用达到的最高性能指标. 延迟 - 其度量标准是缩短由于垃圾啊收集引起的停顿时间或者完全消除因垃圾收集 ...

随机推荐

  1. Ruby 中文编码

    Ruby 中文编码 前面章节中我们已经学会了如何用 Ruby 输出 "Hello, World!",英文没有问题,但是如果你输出中文字符"你好,世界"就有可能会 ...

  2. hibernate(一对多关系)

    代码   public class Main { public static void main(String[] args) { SessionFactory sty = HibernateUtil ...

  3. mybatis浅显认识

    mybatis主配置文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configu ...

  4. Alice拜年 模板题 /// 最短路Dijk oj1344

    题目大意: 大年初一,Alice带上拜年礼物去给N-1位亲朋好友长辈拜年,亲友真多啊,是个大家族.由于Alice才2岁,力气不大,每次只能拿一份礼物,拜完年之后,要回家取第二份礼物,然后去下一家拜年( ...

  5. mysql实现访问审计

    mysql的连接首先都是通过init_connect初始化,然后连接到实例. 我们利用这一点,通过在init_connect的时候记录下用户的thread_id,用户名和用户地址实现db的访问审计功能 ...

  6. SpringDataJPA在Entity中常用的注解浅析

    首先我们常用的注解包括(@Entity.@Table.@Id.@IdClass.@GeneratedValue.@Basic.@Transient.@Column.@Temporal.@Enumera ...

  7. CSIC_716_20191029【人脸打分系统】

    今日内容: 1.调用百度的AI接口,完成人脸图像打分( 敷衍) 2.完成系统内置时间的打印 3.将上述两段代码生成可执行文件 ------------------------------------- ...

  8. 配置虚拟机上的RedHat6 Linux系统的网络(选择的是仅主机模式)

    1.启动虚机,网络选择:仅主机模式 2.进入自己的本地网络配置中,修改相关配置 1)修改VMware NetWork Adapter VMnet1 ip为192.168.137.1,子网掩码:255. ...

  9. 分享安装Apache、MySQL、PHP、LAMP的完整教程

    Operation timed out after 30000 milliseconds with 0 out of -1 bytes received请注意,在Linux中输入密码时,不会显示您输入 ...

  10. cocos2D-X LUA 常用功能封装和工作经验的一些解决方案

    --[[ Packaging_KernelEngine.h 文件说明:所有对象在建立时位置是优先的,传入位置参数必须cc.p(X,Y) CurObj:表示要传入当前的对象 将3.10 lua api ...