JVM进行篇
class Person{ private String name="Jack"; private int age; private final double salary=100; private static String address; private final static String hobby="Programming";
public void say(){
System.out.println("person say...");
} public static int calc(int op1,int op2){
op1=3; int result=op1+op2; return result;
} public static void order(){ } public static void main(String[] args){
calc(1,2); order();
}
}
方法区指向堆
方法区会存放静态变量,常量等数据,如果下面的这种情况,就是典型的方法区中元素执行堆中的对象
private static Object obj=new Object();
堆指向方法区
方法区会包含类的信息,堆中会有对象,那怎么知道对象是哪个类创建的呢?
思考:一个对象怎么知道它是由哪个类创建出来的呢? 怎么记录呢? 这就需要了解一个Java对象的具体信息了
Java对象内存布局
一个对象在内存中包括3个部分: 对象头,实例数据和对齐填充
内存模型:
一块是非堆区,一块是堆区。
堆区分为两大块:一个是old区,一个是Young区,
Young区分为两个大块,一个是Survivor区(s0+s1),一块是Eden区,Eden:s0:s1=8:1:1
s0和s1一样大,也可以叫From和to
根据之前的对于Heap的介绍可以知道,一般对象和数组的创建会在堆中分配内存空间,关键是堆中有那么多区域,那一个对象的创建到底在哪个区域呢?
对象创建所在的区域
一般情况下,新创建的对象都会分配到Eden区,一些特殊的大的对象会直接分配到old区
比如 有对象A,B,C等创建Eden区,但是Eden区的内存空间肯定有限,比如有100M,假如已经使用了100M 或者到达一个设定的临界值,这时候就需要对Eden内存空间进行清理,即垃圾收集,这样的GC我们称之为Minor GC ,Minor GC指得是Young区的GC
经过GC之后,有些对象就会被清理掉,有些对象可能还在存活着,对于存活的对象需要将其复制到Survivor区,然后再清空Eden区中的这些对象
1) 堆内存溢出
@RestController public class HeapController {
List<Person> list=new ArrayList<Person>();
@GetMapping("/heap") public String heap() throws Exception{ while(true){
list.add(new Person());
Thread.sleep(1);
}
}
}
public class MyMetaspace extends ClassLoader { public static List<Class<?>> createClasses() {
List<Class<?>> classes = new ArrayList<Class<?>>(); for (int i = 0; i < 10000000; ++i) {
ClassWriter cw = new ClassWriter(0);
cw.visit(Opcodes.V1_1, Opcodes.ACC_PUBLIC, "Class" + i, null, "java/lang/Object", null);
MethodVisitor mw = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
mw.visitVarInsn(Opcodes.ALOAD, 0);
mw.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
mw.visitInsn(Opcodes.RETURN);
mw.visitMaxs(1, 1);
mw.visitEnd();
Metaspace test = new Metaspace();
byte[] code = cw.toByteArray();
Class<?> exampleClass = test.defineClass("Class" + i, code, 0, code.length);
classes.add(exampleClass);
} return classes;
}
}
@RestController public class NonHeapController {
List<Class<?>> list=new ArrayList<Class<?>>();
@GetMapping("/nonheap") public String nonheap() throws Exception{ while(true){
list.addAll(MyMetaspace.createClasses());
Thread.sleep(5); } } }
public class StackDemo { public static long count=0; public static void method(long i){
System.out.println(count++);
method(i); } public static void main(String[] args) { method(1); } }
理解和说明:
JVM进行篇的更多相关文章
- 初步了解JVM第二篇
在一篇<初步了解JVM第一篇>中,我们已经了解了: 类加载器:负责加载*.class文件,将字节码内容加载到内存中.其中类加载器的类型有如下: 启动类加载器(Bootstrap) 扩展类加 ...
- JVM学习篇-第一篇
JVM学习篇-第一篇 JDK( Java Development Kit): Java程序设计语言.Java虚拟机.Java类库三部分统称为JDK,JDK是用于支持Java程序开发的最小环境** ...
- JVM执行篇:使用HSDIS插件分析JVM代码执行细节--转
http://www.kuqin.com/java/20111031/314144.html 在<Java虚拟机规范>之中,详细描述了虚拟机指令集中每条指令的执行过程.执行前后对操作数栈. ...
- JVM前奏篇(大局观)
话不多说直接上干货,先来看oracle官网中是怎么描述JDK的:https://docs.oracle.com/javase/8/docs/index.html 这是官网中JDK.JRE.JVM的一个 ...
- 初步了解JVM第一篇
大家都知道,Java中JVM的重要性,学习了JVM你对Java的运行机制.编译过程和如何对Java程序进行调优相信都会有一个很好的认知. 废话不多说,直接带大家来初步认识一下JVM. 什么是JVM? ...
- 1.JVM前奏篇(看官网怎么说)
JVM(Java Virtual Machine) 前奏篇(看官网规范怎么说) 1.The relation of JDK/JRE/JVM 在下图中,我们所接触的,最熟悉,也是经常打交道的 最顶层 J ...
- JVM 第二篇:垃圾收集器以及算法
本文内容过于硬核,建议有 Java 相关经验人士阅读. 0. 引言 一说到 JVM ,大多数人第一个想到的可能就是 GC ,今天我们就来聊一聊和 GC 关系最大的垃圾收集器以及垃圾收集算法,希望能通过 ...
- 【JVM第二篇--类加载机制】类加载器与双亲委派模型
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.什么是类加载器 在类加载过程中,加载阶段有一个动作是"通过一个类的全限 ...
- 深入理解JAVA虚拟机之JVM性能篇---垃圾回收
一.基本垃圾回收算法 1. 判断对象是否需要回收的方法(如何判断垃圾): 1) 引用计数(Reference Counting) 对象增加一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回 ...
- JVM基础篇(一)
JVM简介 JVM(Java虚拟机)是一个虚拟的机器,在实际的计算机上通过软件模拟来实现.JVM有自己的硬件,如处理器.堆栈.寄存器等,还具有相应的指令系统. JVM包括一套字节码指令集.一组寄存器. ...
随机推荐
- python中的常用数据类型
python中的常用数据类型 以下是个人总结的python中常见的数据类型,话不多说,我们直接步入正题: 数字类型 整型类:int类可以表示任意大小的整数值,在python中没有像JAVA或者C那样的 ...
- Maven 专题(六):Maven核心概念详解(二)
5 仓库 5.1 分类 [1]本地仓库:为当前本机电脑上的所有 Maven 工程服务.[2]远程仓库: (1)私服:架设在当前局域网环境下,为当前局域网范围内的所有 Maven 工程服务 ...
- 数据可视化之PowerQuery篇(十)如何将Excel的PowerQuery查询导入到Power BI中?
https://zhuanlan.zhihu.com/p/78537828 最近碰到星友的一个问题,他是在Excel的PowerQuery中已经把数据处理好了,但是处理后的数据又想用PowerBI来分 ...
- Babel:下一代Javascript语法编译器
定义 Babel是一个Javascript的编译器,通过它你可以将一些新版本的ECMAScript语法转换成低版本的语法.以便能够在低版本的浏览器或者其它环境平稳运行. 截至目前笔者写这篇文章的时候, ...
- vue : history模式与项目部署的爬坑
需求:url不能有#符号,且不放在服务器虚拟主机的根目录. 假设放在虚拟主机的 medicine 文件夹下. 需要改两个文件,一个是 ./config/index.js (vue设置文件) ,另一个是 ...
- 【JVM之内存与垃圾回收篇】堆
堆 堆的核心概念 堆针对一个 JVM 进程来说是唯一的,也就是一个进程只有一个 JVM,但是进程包含多个线程,他们是共享同一堆空间的. 一个 JVM 实例只存在一个堆内存,堆也是 Java 内存管理的 ...
- python txt装换成excel
工作中,我们需要经常吧一些导出的数据文件,例如sql查出来的结果装换成excel,用文件发送.这次为大家带上python装换excel的脚本 记得先安装wlwt模块,适用版本,python2-3 #c ...
- 【Unity3D】简单常用的功能实现1——鼠标点击实现移动
[鼠标点击实现移动] 第一步,在要移动的GameObject的Inspector面板中添加角色控制器组件并调整参数. 参数的调整可以依照Scene面板,如下图的绿色线框(角色控制器组件是一种胶囊形状的 ...
- 小书MybatisPlus第7篇-代码生成器的原理精讲及使用方法
本文是本系列文章的第七篇,前6篇访问地址如下: 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总结 小书Mybatis ...
- 如何导入spring 的jar包到eclips
https://www.cnblogs.com/xxuan/p/6949640.html