JVM-内存模型分析&启动参数
文章平均质量分 87
JVM-内存模型分析&启动参数
OkidoGreen
这个作者很懒,什么都没留下…
展开
-
JAVA逃逸分析、栈上分配、标量替换、同步消除
一、逃逸分析逃逸分析是编译语言中的一种优化分析,而不是一种优化的手段。通过对象的作用范围的分析,为其他优化手段提供分析数据从而进行优化。逃逸分析包括:全局变量赋值逃逸 方法返回值逃逸 实例引用发生逃逸 线程逃逸:赋值给类变量或可以在其他线程中访问的实例变量.public class EscapeAnalysis { public static Object object; public void globalVariableEscape(){//全局变量转载 2020-11-20 15:34:17 · 683 阅读 · 0 评论 -
【指针压缩】简单聊一聊UseCompressedOops UseCompressedClassPointers这两个JVM参数
jdk6之后默认开启,jdk7下 xmx小于32g默认开启。https://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.htmlUseCompressedOops:普通对象指针压缩,oops:ordinary object pointerUseCompressedClassPointers:类指针压缩这两者有什么作用呢?拿新建一个对象来说:Object o = new Ob.转载 2020-09-19 15:53:05 · 1770 阅读 · 0 评论 -
TLAB、指针碰撞和空闲列表
new对象与指针碰撞new对象怎么就出问题了呢?java中我们要创建一个对象,用关键字new就可以了。但是,在我们日常中,有很多生命周期很短的对象。比如:public void dome(){ User user=new user(); user.sayhi();}这种对象的作用域都不会逃逸出方法外,也就是说该对象的生命周期会随着方法的调用开始而开始,方法的调用结束而结束。假设JVM所有的对象都放在堆内存中(为什么用假设,因为JVM并不是这样)一旦方法结束,没..转载 2020-09-14 19:29:18 · 1405 阅读 · 1 评论 -
关于栈上分配和TLAB的理解
引言我们知道,一般在java程序中,new的对象是分配在堆空间中的,但是实际的情况是,大部分的new对象会进入堆空间中,而并非是全部的对象,还有另外两个地方可以存储new的对象,我们称之为栈上分配以及TLAB栈上分配为什么需要栈上分配在我们的应用程序中,其实有很多的对象的作用域都不会逃逸出方法外,也就是说该对象的生命周期会随着方法的调用开始而开始,方法的调用结束而结束,对于这种对象,是不是该考虑将对象不在分配在堆空间中呢?因为一旦分配在堆空间中,当方法调用结束,没有了引用指向该对象,该对转载 2020-09-13 09:55:38 · 899 阅读 · 1 评论 -
解密Java内存溢出之持久代
垃圾回收是Java程序员了解最少的一部分。他们认为Java虚拟机接管了垃圾回收,因此没必要去担心内存的申请,分配等问题。但是随着应用越来越复杂,垃圾回收也越来越复杂,一旦垃圾回收变的复杂,应用的性能将会大打折扣。所以,Java程序员了解垃圾回收的机制并且知道怎样解决“内存溢出”问题会有很大的益处。在Java中,有两个非常普遍的内存溢出问题。一个是堆内存溢出,另一个是持久代内存溢出。持久代和类加载器 Java对象是java 类的实例。每当创建一个Java对象时,Java虚拟机都会创建该对象...转载 2020-06-20 20:01:41 · 902 阅读 · 0 评论 -
JVM 虚拟机图文详解
前言: 了解Java中的对象、变量等存放的内存区域十分重要 本文将全面讲解Java虚拟机中的内存模型 & 分区,希望你们会喜欢 目录:1. 内存模型 & 分区 Java虚拟机在运行Java程序时,会管理着一块内存区域: 运行时数据区 在运行时数据区里,会根据用途进行划分: Java虚拟机栈(栈区) ...转载 2020-04-14 15:40:59 · 578 阅读 · 0 评论 -
jdk8 Metaspace 调优
简介从JDK8开始,永久代(PermGen)的概念被废弃掉了,取而代之的是一个称为Metaspace的存储空间。Metaspace使用的是本地内存,而不是堆内存,也就是说在默认情况下Metaspace的大小只与本地内存大小有关。当然你也可以通过以下的几个参数对Metaspace进行控制: -XX:MetaspaceSize=N 这个参数是初始化的Metaspace大小,该值越大触发Me...转载 2020-03-17 15:50:53 · 703 阅读 · 0 评论 -
面试官,Java8 JVM内存结构变了,永久代到元空间
JVM内存结构的细化再来看一下《JVM之内存结构详解》中的内存结构图。为了更细化的讲解,我们将该图进行进一步的优化调整。针对java7及以前版本的细化。看出变化了吗?堆和方法区连在了一起,但这并不能说堆和方法区是一起的,它们在逻辑上依旧是分开的。但在物理上来说,它们又是连续的一块内存。也就是说,方法区和前面讲到的Eden和老年代是连续的。在继续进行下去之前,我们先来理解...转载 2020-03-17 15:28:50 · 626 阅读 · 0 评论 -
JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)
https://www.cnblogs.com/yulei126/p/6777323.html1.背景2.为什么废弃永久代(PermGen)3.深入理解元空间(Metaspace)4.总结========正文分割线=====一、背景1.1 永久代(PermGen)在哪里?根据,hotspot jvm结构如下(虚拟机栈和本地方法栈合一起了):上图引自网络,但有...转载 2019-04-08 10:40:46 · 705 阅读 · 0 评论 -
JVM——深入分析对象的内存布局
概述一个对象本身的内在结构需要一种描述方式,这个描述信息是以字节码的方法存储在方法区中的。Class 本身就是一个对象,都以 KB 为单位,如果 new Integer() 为了表示一个数据就占用KB级别的内存就有点不值了,下面讲解 JVM 是如何做的。为了表示对象的属性、方法等信息,不得不需要结构描述。Hotspot VM 使用对象头部的一个指针指向 Class 区域的方式来找到对象的 ...转载 2020-03-17 14:47:52 · 548 阅读 · 0 评论 -
Volatile 单例DCL情况 说明
简介是cpu指令作用保证指令执行的顺序,内存屏障前的指令一定先于内存屏障后的指令 将write buffer的缓存行,立即刷新到内存中重排列内存屏障保证指令的顺序?因为cpu和编译器会进行优化而导致指令重排列,单线程情况下,没什么影响,而多线程时,会发生与我们代码执行顺序不一样的结果。Q:CPU为何要重排序内存访问指令?在哪种场景下会触发重排序?CPU为何要重排序内存...转载 2020-02-22 19:29:10 · 870 阅读 · 0 评论 -
Volatile 原理及摘要内容,DCL单例、内存屏障、JVM及底层实现
内存屏障一堵墙,上下的指令不能重排序比如 storestoreBarrier,屏障上下的2个store不能重排序保证volatile写操作前后的指令。都有屏障,无法重排序...原创 2020-02-22 18:11:45 · 762 阅读 · 0 评论 -
新生代Eden与两个Survivor区的解释
聊聊JVM的年轻代1.为什么会有年轻代我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描。而我们的很多对象都是朝生夕死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先把这块存“朝生夕死”对象的区域进行回...转载 2020-02-20 22:58:12 · 985 阅读 · 0 评论 -
tomcat内存设置及jvm参数调优
设置tomcat的内存1、修改 start.bat 中的call "%EXECUTABLE%" start %CMD_LINE_ARGS%为 call "%EXECUTABLE%" run %CMD_LINE_ARGS%2、 catalina.bat 首行加入set JAVA_OPTS=-server -Xms512m -Xmx51转载 2014-03-22 20:43:42 · 3887 阅读 · 0 评论 -
jvm误区--动态对象年龄判定
虚拟机并不是永远地要求对象的年龄必须达到了MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。学习jvm的人,基本都阅读过上面这段话,这里讲的是动态年龄的判定。对于动态的判定的条件就是相同年龄...转载 2020-02-20 22:53:08 · 1238 阅读 · 1 评论 -
JVM之XX参数详解
JVM的XX参数详解目录标准参数 X参数(了解) XX参数(重点) -Xms,-Xmx是X参数还是XX参数,如何解释?1. 标准参数指每个版本都不会大发生改变的参数测试命令:2. X参数(了解)测试命令3. XX参数(重点)目录布尔类型 KV设值类型 如何查看一个正在运行的java程序,它的某个jvm参数是否开启?具体值是多少?1. 布尔...转载 2020-02-20 21:10:15 · 1168 阅读 · 0 评论 -
JVM内存模型详解
JVM = 类加载器(classloader) + 执行引擎(execution engine) + 运行时数据区域(runtime data area) 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而...转载 2019-01-23 18:40:02 · 645 阅读 · 0 评论 -
JVM内存模型总结
https://blog.csdn.net/u011972171/article/details/80398771 JVM内存模型: 从这张图中很直观的看到,程序计数器,虚拟机栈,native栈是线程私有的,堆是线程共有的,现在详细介绍JVM各个区块。1. 堆(Heap) 是java虚拟机所管理的内存中最大的一块内存区域,也是被各个...转载 2019-01-23 16:48:31 · 608 阅读 · 0 评论 -
浅析java内存模型--JMM(Java Memory Model)
在并发编程中,多个线程之间采取什么机制进行通信(信息交换),什么机制进行数据的同步? 在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的。 线程之间通过共享程序公共的状态,通过读-写内存中公共状态的方式来进行隐式的通信。同步指的是程序在控制多个线程之间执行程序的相对顺序的机制,在共享内存模型中,同步是显式的,程序员必须显式指定某个方法/代码块需要在多线转载 2017-10-30 15:11:24 · 801 阅读 · 0 评论 -
类加载器和双亲委派模型
类加载器按照层次,从顶层到底层,分为以下三种: (1)启动类加载器(Bootstrap ClassLoader) 这个类加载器负责将存放在JAVA_HOME/lib下的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的类库加载到虚拟机内存中。启动类加载器无法被Java程序直接引用。 (2)扩展类加载器(Extension ClassLoader) 这转载 2016-06-13 14:43:35 · 1604 阅读 · 0 评论 -
理解JVM的safepoint
https://blog.csdn.net/iter_zc/article/details/41847887 safepoint是JVM里面很重要的一个概念,在很多场景下都会看到它,尤其是在GC的时候。这篇讲讲safepoint。本人不是做JVM实现研究的,很多地方只能点到为止,希望能够讲清楚这个概念,具体的细节可以自己去找资料深入研究。 safepoint 安全点顾名思义是指一些...转载 2018-07-18 18:39:01 · 7897 阅读 · 1 评论 -
堆外内存 之 DirectByteBuffer 详解
https://www.jianshu.com/p/007052ee3773堆外内存释放代码:http://blog.csdn.net/z69183787/article/details/79316599堆外内存堆外内存是相对于堆内内存的一个概念。堆内内存是由JVM所管控的Java进程内存,我们平时在Java中创建的对象都处于堆内内存中,并且它们遵循JVM的内存管理机制,JVM会采用垃圾回收机制统...转载 2018-02-11 14:04:18 · 1668 阅读 · 0 评论 -
HeapByteBuffer 和 DirectByteBuffer 以及回收 DirectByteBuffer
http://www.importnew.com/19191.htmlbyte buffer一般在网络交互过程中java使用得比较多,尤其是以NIO的框架中;看名字就知道是以字节码作为缓冲的,先buffer一段,然后flush到终端。而本文要说的一个重点就是HeapByteBuffer与DirectByteBuffer,以及如何合理使用DirectByteBuffer。1、HeapByteBuff...转载 2018-02-11 13:50:54 · 1187 阅读 · 0 评论 -
深入研究Java类加载机制
类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行。研究类加载机制的第二个目的是让程序能动态的控制类加载,比如热部署等,提高程序的灵活性和适应性。 一、简单过程 Java程序运行的场所是内存,当在命令行下执行:java HelloWorld命令的时候,JVM会将HelloWorld.class加载到内存中,并转载 2014-06-07 21:47:14 · 1495 阅读 · 1 评论 -
JVM性能调优
最近因项目存在内存泄漏,故进行大规模的JVM性能调优 , 现把经验做一记录。一、JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为:New(年轻代)Tenured(年老代)永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:3G)指定的内存中分配,Perm不属于堆内存,有虚拟机直接分配,但可以通过转载 2014-09-08 13:43:11 · 1161 阅读 · 0 评论 -
JAVA和JVM运行原理揭秘
JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序。AD: 这里和大家简单分享一下JAVA和JVM运行的原理,Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在O转载 2015-01-05 14:26:48 · 1955 阅读 · 0 评论 -
Tomcat 启动命令行参数
CATALINA_OPTS="$CATALINA_OPTS -server -Djava.awt.headless=true -Xms2560m -Xmx2560m -Xss512k -XX:PermSize=128m -XX:MaxPermSize=384m -XX:NewSize=1024m -XX:MaxNewSize=1024m -XX:SurvivorRatio=22 -XX:+Us原创 2016-10-09 15:02:34 · 4997 阅读 · 0 评论 -
eclipse的优化 gc.log
原帖:http://www.javaeye.com/topic/756538性能优化从身边做起。 首先建立评估体系,将workspace里所有的项目close掉,关闭eclipse。优化的用例就是启动eclipse,open一个项目,eclipse会自动build这个项目,保证没有感觉到明显的卡,也就是没有full GC。 开始: eclipse.ini里加转载 2014-09-08 13:42:43 · 4236 阅读 · 0 评论 -
Java命令行运行参数说明大全(偷来的)
Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOME"bin"java –option 来启动,-option为虚拟机参数,JAVA_HOME为JDK安装路径,通过这些参数可对虚拟机的运行状态进行调整,掌握参数的含义可对虚拟机的运行模式有更深入理解。一、 查看参数列表:虚拟机参数分为基本和扩展两类,在命令行转载 2014-02-25 17:00:17 · 1448 阅读 · 0 评论 -
JVM 触发Full gc条件
本文参考:http://blog.csdn.net/chenleixing/article/details/46706039 给出各个场景下可能触发full gc的实例代码.1.调用System.gcimport java.util.ArrayList;import java.util.List;/** * * created by: gaoxingliang@outl转载 2016-10-08 16:27:30 · 10848 阅读 · 1 评论 -
聊聊JVM的年轻代
1.为什么会有年轻代我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描。而我们的很多对象都是朝生夕死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先把这块存“朝生夕死”对象的区域进行回收,这样就会转载 2016-10-08 17:21:25 · 2003 阅读 · 1 评论 -
JVM参数:MaxTenuringThreshold和TargetSurvivorRatio说明
-XX:MaxTenuringThreshold在新生代中对象存活次数(经过Minor GC的次数)后仍然存活,就会晋升到旧生代。-XX:TargetSurvivorRatio一个计算期望存活大小Desired survivor size的参数.计算公式: (survivor_capacity * TargetSurvivorRatio) / 100 * sizeof(a转载 2016-10-08 18:43:27 · 7617 阅读 · 1 评论 -
Java 的方法签名与字段类型表示-[Ljava.lang.String;
我们什么时候会接触到 Java 的方法签名呢?在进行 JNI 调用时,还有在看方法重载时。重载的方法是有不同的方法签名的,而是不区分返回值,而实际方法签名还揉入了返回值类型的,还有就是 javap -s 查看方法签名时,如 javap -s java.util.Date。看来方法签名与我们实际工作的关系还真的不大。倒是有次遇着了,事出于 Struts2 应用中提交表单时报出了下面的错误:转载 2017-01-06 17:25:09 · 16819 阅读 · 1 评论 -
Java虚拟机解析篇之---内存模型
今天闲来无事来,看一下Java中的内存模型和垃圾回收机制的原理,关于这个方面的知识,网上已经有很多现成的资料可以供我们参考,但是知识还是比较杂的,在这部分知识点中有一本书不得不推荐:《深入理解Java虚拟机》,现在已经是第二版了。这本书就从头开始详细介绍了Java整个虚拟机的模型以及Java的类文件结构,加载机制等。这里大部分的知识点都是可以在这本书中找到的,当然我是主要还是借鉴这本书中的很多内容转载 2017-03-03 17:49:05 · 1383 阅读 · 0 评论 -
Java虚拟机解析篇之---垃圾回收器
上一篇说了虚拟机的内存模型,在说到堆内存的时候我们提到了,堆内存是Java内存中区域最大的一部分,而且垃圾回收器主要就是回收这部分的内容。那么这篇就来介绍一下垃圾回收器的原理以及回收的算法。Java中的垃圾回收器(GC)是Java中比较有特色的一点,不需要我们手动的去管理一个对象,不想C++中的构造函数和析构函数一样,需要程序猿自己去手动的管理,很容易造成内存泄露的问题。当然如果学过OC语转载 2017-03-03 17:49:49 · 910 阅读 · 0 评论 -
全面理解Java内存模型
http://m.blog.csdn.net/suifeng3051/article/details/52611310Java内存模型即Java Memory Model,简称JMM。JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。如果我们要想深入了解Java并发编程,就要先理解好Ja转载 2017-10-30 15:13:55 · 838 阅读 · 0 评论 -
JVM优化系列之一(-Xss调整Stack Space的大小)
http://blog.csdn.net/zhuyijian135757/article/details/38025339Java程序中,每个线程都有自己的Stack Space(堆栈)。这个Stack Space不是来自Heap的分配。所以Stack Space的大小不会受到-Xmx和-Xms的影响,这2个JVM参数仅仅是影响Heap的大小。Stack Space用来做方转载 2018-02-01 14:34:06 · 10968 阅读 · 0 评论 -
java高分局之JVM命令参数大全(高级垃圾回收选项)
java高分局之JVM命令参数大全(高级垃圾回收选项)这些选项控制Java HotSpot虚拟机怎么进行垃圾回收。 - -XX:+AggressiveHeap java堆最佳化设置。设置多个参数使长时间运行过的任务使用密集的内存分配。 默认这个选项时关闭的,也就是堆不是最佳化。 - -XX:+AlwaysPreTouch 在调用main函数之前,使用所有可用的内存分页。这个转载 2018-02-01 14:36:04 · 1230 阅读 · 0 评论 -
4种方式配置不同作用域的jvm的堆栈内存。
1、Eclise 中设置jvm内存: 改动eclipse的配置文件,对全部project都起作用 改动eclipse根文件夹下的eclipse.ini文件 -vmargs //虚拟机设置 -Xms40m //初始内存 -Xmx256m //最大内存 -Xmn16m //最小内存 -XX:PermS转载 2018-02-01 14:40:01 · 810 阅读 · 0 评论 -
JVM内存参数详解以及配置调优
基本概念:PermGen space:全称是Permanent Generation space。就是说是永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域Heap space:存放Instance。GC(Garbage Collection)应该不会对PermGen space进行清理所以如果你的APP会LOAD很多CLASS的话,就很可能出现转载 2014-03-22 20:43:05 · 2624 阅读 · 0 评论