您的位置: 首页 - 站长

wordpress4.4.2东莞网站建设优化东莞

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

wordpress4.4.2,东莞网站建设优化东莞,网站建设类岗位杭州,代做设计网站好一、JVM内存结构 java的内存模型主要分为5个部分#xff0c;分别是#xff1a;JVM堆、JVM栈、本地栈、方法区还有程序计数器#xff0c;他们的用途分别是#xff1a; JVM堆#xff1a;新建的对象都会放在这里#xff0c;他是JVM中所占内存最大的区域。他又分为新生区还…一、JVM内存结构 java的内存模型主要分为5个部分分别是JVM堆、JVM栈、本地栈、方法区还有程序计数器他们的用途分别是 JVM堆新建的对象都会放在这里他是JVM中所占内存最大的区域。他又分为新生区还有老年区刚new出来的对象放在新生区等到内存不够的时候再转移到老年区这里面有一系列的GC算法在后面讲到。JVM栈他是以线程为单位进行存储的所以他只对单个线程是可见的。JVM栈是基于栈的数据结构来存储的每一个栈内元素是一个栈帧一个方法被调用就生成一个栈帧栈帧里面保存着局部变量表、操作栈、动态链接还有方法返回地址信息。本地方法栈jvm可以调用本地方法通过JNI方法这个区域就是用来保存本地调用的。本地方法区Method Area:本地方法区里面有方法常量池、保存类信息、保存方法信息的数据结构在GC过程中这里也是永久代数据保存的地方。程序计数器就像CPU的寄存器一样他是记录线程切换时候机器码的行号和偏移量的等方法回调能够正常回到方法。 二、JMM内存模型 Java的内存模型决定了线程间的通信方式JMM的模型是由主存和本地内存构成两个线程想要正常通行需要将本地内存中的变量刷到主存中另一个线程才能正确读取得到这个也是volitile关键词的原理所在。 JMM模型决定了线程见的通信由于线程内的变量首先会存储在本地内存中如果需要线程间通信需要写入主存中供其他线程读取。 由于JVM在执行程序时会产生重排序所有需要引入volitile等关键词。 三、GC算法 1.可达性算法 1.1.引用计数算法 原理对每个对象的引用计数引用了则1释放了则-1 1.2.GC root算法 给定一个GC root的集合的引用作为根出发 通过引用关系遍历对象图能被遍历到的(可达到的)对象就判定为存活, 其余对象(也就是没有被遍历到的)就自然被判定为死亡。 可以做GC root的是 虚拟机栈方法中引用的对象类变量静态变量引用的对象常量引用的对象JNI引用的对象 2.GC算法 复制算法从根集合开始扫描将存活的对象复制到另一块空闲的区域标记-清除算法从根集合开始扫描将存活的对象进行标记将未标记的空间进行清空标记-压缩算法从根集合开始扫描将存活的对象进行标记和清除但清除后会将存活对象移动到空闲区域 对比基于copy的算法适用于存活对象比较多的GC场景Mark-sweep适合存活对象较少的场景。 copy based GC算法适合存活对象少的年轻代实现mark-sweep GC算法适合再存活对象多的老年代实现。 四、GC回收器 衡量GC的指标主要是吞吐量、暂停时间。 吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值即吞吐量 运行用户代码时间 /运行用户代码时间垃圾收集时间。比如虚拟机总共运行了100分钟其中垃圾收集花掉1分钟那吞吐量就是99%。 暂停时间是指一个时间段内应用程序线程暂停让GC线程执行的状态。例如GC期间100毫秒的暂停时间意味着在这100毫秒期间内没有应用程序线程是活动的。 GC回收器的种类 1serial回收器就是在GC回收的时候工作线程暂定他是一个串行的回收器 2parallel回收器就是GC回收器是并发执行的因此提升了GC的吞吐量GC过程中会stop the world 3CMS他的全程是concurrent mark sweep他的主要优势是在GC回收大多数时候不需要stop the world 4G1:这个是从JDK7后推出的新的GC在JDK1.9成为了默认的GC回收器 1.CMS回收器 CMS是并发标记清除GC回收器件其目标是\获取最短GC停顿时间**比较符合大型web server项目的使用场景。其GC阶段经过4个阶段 初始标记初始标记又GC root引用的对象该过程会引发STW并发标记这个是不需要STW并发标记要回收的对象重新标记这个节点重新标记并发阶段产生的新的要回收的对象并发清除并发清除标记的要回收的对象 CMS总结 优点1并发处理效率高2GC的时候不会整体停顿STW有效降低处理时延。缺点1并发清理时会降低CPU性能2标记-清理可能会造成大量内存碎片3并发清理阶段还会产生垃圾这种垃圾称为浮动垃圾需要下一次GC时才能清理掉。 2.G1回收器 G1回收器会将区域划分为region每个region可以是新生代也可以是老年代通过控制对region的回收做到对垃圾回收导致的STW可控。垃圾回收的阶段前3个阶段和CMS一致只是最后一个节点需要通过混合清除来回收新生代和老年代所有的对象 初始标记标记GC root对象需要暂停所有用户线程该过程会引发STW并发标记标记GC root可达的对象。最终标记标记在并发标记阶段产生的需回收对象。筛选回收对各个Region的回收成本和价值进行排序根据用心要求的GC停顿时间来选择需要GC的Region。 G1总结 优点1并发处理效率高2整体停顿STW的时间可控3新生掉和老年代都分为逻辑上的region通过GC的复制算法解决内存碎片的问题缺点引入了Remembered Set来保存内存引用信息所以增加了内存占用所以G1一般在大内存的服务端环境使用起步内存大小为8G。 3.对比总结 总结 选择GC主要考虑的是使用场景一般嵌入式、内存较小的选择串行GC回收器对于需求吞吐量大的常见可以选择并行GC回收器对于需要时延少的场景可以选择CMS或者G1回收器CMS回收器整体更侧重增大吞吐量G1回收器整体是平衡了降低时延和增大吞吐量的要求 对比 serial GC垃圾回收器serial GC就是串行的GCCMS GC垃圾回收器CMS经过1初始标记2并发标记3重新标记4并发清除四个阶段来完成G1 GC垃圾回收期G1回收会将区域划分为regionG1通过1初始标记2并发标记3最终标记4筛选回收四个阶段完成其中阶段四可以计算每个region的耗时来权衡总耗时来达到一个平衡。总之回收时间可控 五、对象实例化的过程 首先我们要明白JVM的作用是什么那就是将.class文件加载到内存并且实例化成对象在实例化成对象的过程中需要有哪些操作呢 在进入这一步之前需要一些前置知识包括java的54种引用类型和引用在内存中的指向等 java引用的4种类型 1强引用利用这种方式创建的对象是强应用Object obj new Object()这种引用在gc时候不会回收 2软引用软引用在一次gc时候不会回收之后不一定 3弱引用弱引用在gc时候一定会被gc 4虚引用这个用的不多所以不了解 栈中引用指向堆中对象 对象实例化的过程 1在new一个新的对象时想在本地方法区中找是否有对于的类元信息有的话直接调用相应的classloader进行加载没有的话委托给他的父级classloader进行查找这一步主要是将字节码文件通过字节流的心事加载进来 2为对象分配内存空间。由于对象是存储在堆中而引用是存在jvm栈中所以栈中引用需要通过指针的方式只想堆中相应对象这一步是需要在堆和栈中为对象分配内存空间。 3设置默认值和初始化。每一个基本数据都有默认值所以在这一步需要为变量设置默认值同时为成员变量进行初始化操作。 参考资料 JVM内存模型JVMMMhttps://www.huaweicloud.com/zhishi/arc-12588701.htmlJVM之配置参数详解和调优总结(二):https://www.huaweicloud.com/articles/b86de23d6c3d5a161b25b1013a388d8d.htmljstat命令查看jvm的GC情况 以Linux为例http://blog.itpub.net/31543790/viewspace-2657093/JVM的架构与知识脉络图https://mp.weixin.qq.com/s/RxzAePMS3ZSnqUY6cj6i7Q《深入理解java虚拟机》ClassLoader讲的不错https://juejin.im/post/5c04892351882516e70dcc9b?utm_sourcegold_browser_extension参考资料https://mp.weixin.qq.com/s?src11timestamp1638361551ver3470signatureGmx2ox8EgDaJsmgMjMMcQb9v87rY-5z9dx*YUJa62leRyG0FI7gXk9eU55UiHMWJ6NYs-7W8GRh2328dZ3mBCbr7O-rFCdNNwYT-8tfe*Ypw8wQ2vpTRfL2nN-28qgBxnew1弄明白CMS和G1就靠这一篇了https://cloud.tencent.com/developer/article/1647637JVM十六垃圾回收器https://blog.csdn.net/sd_960614/article/details/126900380 本文由博客一文多发平台 OpenWrite 发布