当前位置: 首页 > news >正文

幸福宝推广app网站下载餐饮品牌全案设计公司

幸福宝推广app网站下载,餐饮品牌全案设计公司,龙岩建筑网,怎么制作自己的网站网页文章目录 版权声明一 堆1.1 java堆1.2 模拟堆区的溢出1.3 arthas中堆内存相关的功能1.4 设置大小 二 方法区2.1 方法区简介2.2 补充#xff1a;字符串常量池和运行时常量池2.3 方法区的大小设计2.4 arthas中查看方法区2.5 模拟方法区的溢出2.7 StringTable的练习题 三 神奇的i… 文章目录 版权声明一 堆1.1 java堆1.2 模拟堆区的溢出1.3 arthas中堆内存相关的功能1.4 设置大小 二 方法区2.1 方法区简介2.2 补充字符串常量池和运行时常量池2.3 方法区的大小设计2.4 arthas中查看方法区2.5 模拟方法区的溢出2.7 StringTable的练习题 三 神奇的intern四 静态变量的存储五 直接内存5.1 直接内存简介5.2 设置直接内存大小 六 jvm内存总结 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明所有版权属于黑马程序员或相关权利人所有。本博客的目的仅为个人学习和交流之用并非商业用途。我在整理学习笔记的过程中尽力确保准确性但无法保证内容的完整性和时效性。本博客的内容可能会随着时间的推移而过时或需要更新。若您是黑马程序员或相关权利人如有任何侵犯版权的地方请您及时联系我我将立即予以删除或进行必要的修改。对于其他读者请在阅读本博客内容时保持遵守相关法律法规和道德准则谨慎参考并自行承担因此产生的风险和责任。本博客中的部分观点和意见仅代表我个人不代表黑马程序员的立场。 一 堆 1.1 java堆 一般Java程序中堆内存是空间最大的一块内存区域。创建出来的对象都存在于堆上 栈上的局部变量表中可以存放堆上对象的引用。静态变量也可以存放堆对象的引用通过静态变量就可以实现对象在线程之间共享 堆空间有三个需要关注的值used total max used当前已使用的堆内存 totaljava虚拟机已经分配的可用堆内存max是java虚拟机可以分配的最大堆内存 随着堆中的对象增多当total内存不足时java虚拟机会继续分配内存给堆。如果堆内存不足java虚拟机就会不断的分配内存total值会变大。total最多只能与max相等。 如果不设置任何的虚拟机参数max默认是系统内存的1/4total默认是系统内存的1/64。在实际应用中一般都需要设置total和max的值 1.2 模拟堆区的溢出 通过new关键字不停创建对象放入集合中模拟堆内存的溢出观察堆溢出之后的异常信息。堆内存有上限当对象一直向堆中放入对象达到上限后就会抛出OutOfMemory错误 package JVM.heap;import java.io.IOException; import java.util.ArrayList;/*** 堆内存的使用和回收*/ public class Demo1 {public static void main(String[] args) throws InterruptedException, IOException {ArrayListObject objects new ArrayListObject();while (true){objects.add(new byte[1024 * 1024 * 100]);}} } Exception in thread main java.lang.OutOfMemoryError: Java heap space1.3 arthas中堆内存相关的功能 堆内存used total max三个值可以通过dashboard命令看到手动指定刷新频率不指定默认5秒一次dashboard-i刷新频率(毫秒) Memory used total max usage GC heap 185M 972M 14409M 1.29% gc.ps_scavenge.count 0 ps_eden_space 185M 254M 5319M 3.49% gc.ps_scavenge.time(ms) 0 ps_survivor_space 0K 43008K 43008K 0.00% gc.ps_marksweep.count 0 ps_old_gen 0K 692224K 11066368K 0.00% gc.ps_marksweep.time(ms) 0 nonheap 29M 30M -1 96.51% code_cache 7M 8M 240M 3.31% metaspace 19M 20M -1 96.90% compressed_class_space 2M 2M 1024M 0.23% direct 1500M 1500M - 100.00% mapped 0K 0K - 0.00%1.4 设置大小 修改堆的大小可以使用虚拟机参数 –Xmxmax最大值和-Xms (初始的total) 语法-Xmx值 -Xms值 单位字节默认必须是 1024 的倍数、k或者K(KB)、m或者M(MB)、g或者G(GB) 限制Xmx必须大于 2 MBXms必须大于1MB arthas中显示的heap堆大小与设置的值不一样的解释arthas中的heap堆内存使用了JMX技术中内存获取方式这种方式与垃圾回收器有关计算的是可以分配对象的内存而不是整个内存。 Java服务端程序开发时建议将-Xmx和-Xms设置为相同的值在程序启动之后可使用的总内存就是最大内存而无需向java虚拟机再次申请减少申请并分配内存时间上的开销同时也避免出现内存过剩之后堆收缩的情况。 二 方法区 2.1 方法区简介 方法区是存放基础信息的位置线程共享主要包含三部分内容类的元信息、运行时常量池、字符串常量池 方法区存储每个类的基本信息元信息一般称之为InstanceKlass对象在类的加载阶段完成。 方法区还存放运行时常量池常量池中存放的是字节码中的常量池内容。 静态常量池字节码文件中通过编号查表的方式找到常量。运行时常量池当常量池加载到内存中之后通过内存地址快速的定位到常量池中的内容。 方法区中还有一块区域叫字符串常量池(StringTable)。字符串常量池存储在代码中定义的常量字符串内容。比如“123” 123就会被放入字符串常量池 2.2 补充字符串常量池和运行时常量池 早期设计时字符串常量池是运行时常量池的一部分存储位置一致。后续做了调整将字符串常量池和运行时常量池做了拆分。 2.3 方法区的大小设计 方法区是《Java虚拟机规范》中设计的虚拟概念每款Java虚拟机在实现上都各不相同。Hotspot设计如下 JDK7及之前的版本将方法区存放在堆区域中的永久代空间堆的大小由虚拟机参数来控制。JDK8及之后的版本将方法区存放在元空间中元空间位于操作系统维护的直接内存中默认情况下只要不超过操作系统承受的上限可以一直分配。 2.4 arthas中查看方法区 使用memory命令打印出内存情况JDK7及之前的版本查看ps_perm_gen属性JDK8及之后的版本查看metaspace属性。 2.5 模拟方法区的溢出 通过ByteBuddy框架动态生成字节码数据加载到内存中。通过死循环不停地加载到方法区观察方法区是 否会出现内存溢出的情况。import jdk.internal.org.objectweb.asm.ClassWriter; import jdk.internal.org.objectweb.asm.Opcodes; import java.io.IOException; /*** 方法区的溢出测试*/ public class Demo1 extends ClassLoader {public static void main(String[] args) throws IOException {System.in.read();Demo1 demo1 new Demo1();int count 0;while (true) {String name Class count;ClassWriter classWriter new ClassWriter(0);classWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, name, null, java/lang/Object, null);byte[] bytes classWriter.toByteArray();demo1.defineClass(name, bytes, 0, bytes.length);System.out.println(count);}} }Exception in thread main java.lang.OutOfMemoryError: MetaspaceJDK7将方法区存放在堆区域中的永久代空间堆的大小由虚拟机参数-XX:MaxPermSize值来控制JDK8将方法区存放在元空间中元空间位于操作系统维护的直接内存中默认情况下只要不超过操作系统承受的上限可以一直分配。可以使用-XX:MaxMetaspaceSize值将元空间最大大小进行限制 -XX:MaxMetaspaceSize128M192546 Exception in thread main java.lang.OutOfMemoryError: Metaspaceat java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClass(ClassLoader.java:763)at java.lang.ClassLoader.defineClass(ClassLoader.java:642)at JVM.methodarea.Demo1.main(Demo1.java:21)2.7 StringTable的练习题 练习1public static void main(String[] args) {String a 1;String b 2;String c 12;String d a b;System.out.println(c d); //false }练习2public static void main(String[] args) {String a 1;String b 2;String c 12;String d 1 2;System.out.println(c d); //true }三 神奇的intern 原来创建字符串的方式是通过源代码中的常量进行定义并且通过字节码信息加载到常量池里面。String.intern()方法是可以手动将字符串放入字符串常量池中。public static void main(String[] args) {String s1 new StringBuilder().append(think).append(123).toString();System.out.println(s1.intern()s1);// java是在启动的过程中直接放到字符串常量池中String s2 new StringBuilder().append(ja).append(va).toString();System.out.println(s2.intern()s2); }JDK6版本中intern () 方法会把第一次遇到的字符串实例复制到永久代的字符串常量池中返回的也是永久代里面这个字符串实例的引用。JVM启动时就会把java加入到常量池中。 JDK7及之后版本中由于字符串常量池在堆上所以intern () 方法会把第一次遇到的字符串的引 用放入字符串常量池。 四 静态变量的存储 JDK6及之前的版本中静态变量是存放在方法区中的也就是永久代 JDK7及之后的版本中静态变量是存放在堆中的Class对象中脱离了永久代。具体源码可参考虚拟机源码BytecodeInterpreter针对putstatic指令的处理 五 直接内存 5.1 直接内存简介 直接内存Direct Memory并不在《Java虚拟机规范》中存在所以并不属于Java运行时的内存区域。在 JDK 1.4 中引入了 NIO 机制使用了直接内存主要为了解决以下两个问题: Java堆中的对象如果不再使用要回收回收时会影响对象的创建和使用。IO操作如读文件需要先把文件读入直接内存缓冲区再把数据复制到Java堆中。 现在直接放入直接内存即可同时Java堆上维护直接内存的引用减少了数据复制的开销 创建直接内存上的数据可以使用ByteBuffer 语法 ByteBuffer directBuffer ByteBuffer.allocateDirect(size);注意事项 arthas的memory命令可以查看直接内存大小属性名direct Memory used total max usage GC heap 185M 972M 14409M 1.29% gc.ps_scavenge.count 0 direct 1500M 1500M - 100.00% mapped 0K 0K - 0.00%5.2 设置直接内存大小 如果需要手动调整直接内存的大小可以使用-XX:MaxDirectMemorySize大小单位k或K表示千字节m或M表示兆字节g或G表示千兆字节。默认不设置该参数情况下JVM 自动选择最大分配的大小-XX:MaxDirectMemorySize1m/*** 直接内存的使用和回收*/ public class Demo1 {public static int size 1024 * 1024 * 100; //100mbpublic static ListByteBuffer list new ArrayListByteBuffer();public static int count 0;public static void main(String[] args) throws IOException, InterruptedException {System.in.read();while (true) {//1.创建DirectByteBuffer对象并返回//2.在DirectByteBuffer构造方法中向操作系统申请直接内存空间ByteBuffer directBuffer ByteBuffer.allocateDirect(size);//directBuffer null;list.add(directBuffer);System.out.println(count);Thread.sleep(5000);}} }Exception in thread main java.lang.OutOfMemoryError: Direct buffer memory六 jvm内存总结 运行时数据区的组成部分和每一部分的作用 同JDK版本之间运行时数据区域的区别
http://www.hkea.cn/news/14406917/

相关文章:

  • 手机如何创建个人网站网站建设行业企业排名
  • wordpress 站库分离广告联盟怎么赚钱
  • 河北提供网站建设公司哪家好ai做网站
  • 瑞安 网站建设域名解析网站登录
  • 做网站需要域名 域名是啥网上写文章用什么软件
  • 网站界面设计的发展趋势合肥网站制作建设
  • 网站w3c标准南宁网站推广v1
  • 电脑培训学校网站手机网站排名
  • 网站建站系统程序毕节地seo
  • 露营旅游网站策划书乡村建设网站
  • 长春网站建设公司排名服务号 订阅号
  • 做网站首页的尺寸网上学平面设计
  • 现代锦州网站建设软件开发上海
  • 图片设计网站免费宁夏建设投资集团公司网站
  • 历下区网站建设公司微信公共平台开发
  • 烟台网站的优化电子政务网站建设公司
  • 提供营销单页网站亚马逊跨境电商开店流程
  • 网站模板广告去除亚马逊产品开发流程
  • 企业网站模板seo线上运营推广
  • 智能网站建设商家godaddy 搭建网站
  • 遵义专业网站建设公司电话网站建设字体
  • 旅游网站排名前5位的网络营销能做什么
  • 免费装饰公司网站模板阿里云速美建站
  • 建设网站的推广的软文专业做网站服务商
  • 深圳西乡网站建设做外贸网站市场
  • 期刊类网站建设加拿大搜索引擎
  • 高端网站设计价格广州动漫制作公司
  • 网站中页面链接怎么做的c 做网站怎么截取前面的字符
  • 网站开发的基本技术路线免费建企业网站哪个好
  • 食品网站建设风格政务微网站建设方案