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

阿里云虚拟主机多个网站吗淄博企业网站建设

阿里云虚拟主机多个网站吗,淄博企业网站建设,不用付费就可以看亏亏的app,wordpress制作交友软件1.什么是Java虚拟机#xff1f;为什么Java被称作是“平台无关的编程语言”#xff1f; Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。 Java被设计成允许应用程序可以运行在任意的平台#xff0c;而不需要程序员为每…1.什么是Java虚拟机为什么Java被称作是“平台无关的编程语言” Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。 Java被设计成允许应用程序可以运行在任意的平台而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能因为它知道底层硬件平台的指令长度和其他特性。 2.Java内存结构 方法区和对是所有线程共享的内存区域而java栈、本地方法栈和程序员计数器是运行是线程私有的内存区域。 Java堆(Heap),是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例几乎所有的对象实例都在这里分配内存。 方法区(Method Area),方法区(Method Area)与Java堆一样是各个线程共享的内存区域它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 程序计数器(Program Counter Register),程序计数器(Program Counter Register)是一块较小的内存空间它的作用可以看做是当前线程所执行的字节码的行号指示器。 JVM栈(JVM Stacks),与程序计数器一样Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。 本地方法栈(Native Method Stacks),本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务而本地方法栈则是为虚拟机使用到的Native方法服务。 3.解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法 通常我们定义一个基本数据类型的变量一个对象的引用还有就是函数调用的现场保存都使用JVM中的栈空间而通过new关键字和构造器创建的对象则放在堆空间堆是垃圾收集器管理的主要区域由于现在的垃圾收集器都采用分代收集算法所以堆空间还可以细分为新生代和老生代再具体一点可以分为Eden、Survivor(又可分为From Survivor和To Survivor)、Tenured方法区和堆都是各个线程共享的内存区域用于存储已经被JVM加载的类信息、常量、静态变量、JIT编译器编译后的代码等数据程序中的字面量(literal)如直接书写的100、”hello”和常量都是放在常量池中常量池是方法区的一部分。栈空间操作起来最快但是栈很小通常大量的对象都是放在堆空间栈和堆的大小都可以通过JVM的启动参数来进行调整栈空间用光了会引发StackOverflowError而堆和常量池空间不足则会引发OutOfMemoryError。 String str new String(“hello”); 上面的语句中变量str放在栈上用new创建出来的字符串对象放在堆上而”hello”这个字面量是放在方法区的。 补充1较新版本的Java(从Java 6的某个更新开始)中由于JIT编译器的发展和”逃逸分析”技术的逐渐成熟栈上分配、标量替换等优化技术使得对象一定分配在堆上这件事情已经变得不那么绝对了。 补充2运行时常量池相当于Class文件常量池具有动态性Java语言并不要求常量一定只有编译期间才能产生运行期间也可以将新的常量放入池中String类的intern()方法就是这样的。 看看下面代码的执行结果是什么并且比较一下Java 7以前和以后的运行结果是否一致。 String s1 new StringBuilder(“go”) .append(“od”).toString(); System.out.println(s1.intern() s1); String s2 new StringBuilder(“ja”) .append(“va”).toString(); System.out.println(s2.intern() s2); 4.对象分配规则 对象优先分配在Eden区如果Eden区没有足够的空间时虚拟机执行一次Minor GC。 大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。 长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器如果对象经过了1次Minor GC那么对象会进入Survivor区之后每经过一次Minor GC那么对象的年龄加1知道达到阀值对象进入老年区。 动态判断对象的年龄。如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半年龄大于或等于该年龄的对象可以直接进入老年代。 空间分配担保。每次进行Minor GC时JVM会计算Survivor区移至老年区的对象的平均大小如果这个值大于老年区的剩余值大小则进行一次Full GC如果小于检查HandlePromotionFailure设置如果true则只进行Monitor GC,如果false则进行Full GC。 5.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中将其放在运行时数据区的方法区内然后在堆区创建一个java.lang.Class对象用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象Class对象封装了类在方法区内的数据结构并且向Java程序员提供了访问方法区内的数据结构的接口。 6.类加载器 启动类加载器Bootstrap ClassLoader负责加载存放在JDK\jre\lib(JDK代表JDK的安装目录下同)下或被-Xbootclasspath参数指定的路径中的并且能被虚拟机识别的类库 扩展类加载器Extension ClassLoader该加载器由sun.misc.Launcher$ExtClassLoader实现它负责加载DK\jre\lib\ext目录中或者由java.ext.dirs系统变量指定的路径中的所有类库(如javax.*开头的类)开发者可以直接使用扩展类加载器。 应用程序类加载器Application ClassLoader该类加载器由sun.misc.Launcher$AppClassLoader来实现它负责加载用户类路径(ClassPath)所指定的类开发者可以直接使用该类加载器 7.描述一下JVM加载class文件的原理机制 答JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的Java中的类加载器是一个重要的Java运行时系统组件它负责在运行时查找和装入类文件中的类。 由于Java的跨平台性经过编译的Java源程序并不是一个可执行程序而是一个或多个类文件。当Java程序需要使用某个类时JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的.class文件中的数据读入到内存中通常是创建一个字节数组读入.class文件然后产生与所加载类对应的Class对象。加载完成后Class对象还不完整所以此时的类还不可用。当类被加载后就进入连接阶段这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化包括1)如果类存在直接的父类并且这个类还没有被初始化那么就先初始化父类2)如果类中存在初始化语句就依次执行这些初始化语句。 类的加载是由类加载器完成的类加载器包括根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。从Java 2(JDK 1.2)开始类加载过程采取了父亲委托机制(PDM)。PDM更好的保证了Java平台的安全性在该机制中JVM自带的Bootstrap是根加载器其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载父类加载器无能为力时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用。下面是关于几个类加载器的说明 Bootstrap一般用本地代码实现负责加载JVM基础核心类库(rt.jar) Extension从java.ext.dirs系统属性所指定的目录中加载类库它的父加载器是Bootstrap System又叫应用类加载器其父类是Extension。它是应用最广泛的类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类是用户自定义加载器的默认父加载器。 8.描述一下JVM加载class文件的原理机制 JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的Java中的类加载器是一个重要的Java运行时系统组件它负责在运行时查找和装入类文件中的类。 由于Java的跨平台性经过编译的Java源程序并不是一个可执行程序而是一个或多个类文件。当Java程序需要使用某个类时JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的.class文件中的数据读入到内存中通常是创建一个字节数组读入.class文件然后产生与所加载类对应的Class对象。加载完成后Class对象还不完整所以此时的类还不可用。当类被加载后就进入连接阶段这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化包括 1)如果类存在直接的父类并且这个类还没有被初始化那么就先初始化父类 2)如果类中存在初始化语句就依次执行这些初始化语句。 类的加载是由类加载器完成的类加载器包括根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。 从Java 2(JDK 1.2)开始类加载过程采取了父亲委托机制(PDM)。PDM更好的保证了Java平台的安全性在该机制中JVM自带的Bootstrap是根加载器其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载父类加载器无能为力时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用。下面是关于几个类加载器的说明 Bootstrap一般用本地代码实现负责加载JVM基础核心类库(rt.jar) Extension从java.ext.dirs系统属性所指定的目录中加载类库它的父加载器是Bootstrap System又叫应用类加载器其父类是Extension。它是应用最广泛的类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类是用户自定义加载器的默认父加载器。 9.Java对象创建过程 1.JVM遇到一条新建对象的指令时首先去检查这个指令的参数是否能在常量池中定义到一个类的符号引用。然后加载这个类(类加载过程在后边讲) 2.为对象分配内存。一种办法“指针碰撞”、一种办法“空闲列表”最终常用的办法“本地线程缓冲分配(TLAB)” 3.将除对象头外的对象内存空间初始化为0 4.对对象头进行必要设置 10.类的生命周期 类的生命周期包括这几个部分加载、连接、初始化、使用和卸载其中前三部是类的加载的过程,如下图 加载查找并加载类的二进制数据在Java堆中也创建一个java.lang.Class类的对象 连接连接又包含三块内容验证、准备、初始化。 1)验证文件格式、元数据、字节码、符号引用验证 2)准备为类的静态变量分配内存并将其初始化为默认值 3)解析把类中的符号引用转换为直接引用 初始化为类的静态变量赋予正确的初始值 使用new出对象程序中使用 卸载执行垃圾回收 11.Java对象结构 Java对象由三个部分组成对象头、实例数据、对齐填充。 对象头由两部分组成第一部分存储对象自身的运行时数据哈希码、GC分代年龄、锁标识状态、线程持有的锁、偏向线程ID(一般占32/64 bit)。第二部分是指针类型指向对象的类元数据类型(即对象代表哪个类)。如果是数组对象则对象头中还有一部分用来记录数组长度。 实例数据用来存储对象真正的有效信息(包括父类继承下来的和自己定义的) 对齐填充JVM要求对象起始地址必须是8字节的整数倍(8字节对齐) 12.Java对象的定位方式 句柄池、直接指针。 13.如何判断对象可以被回收 判断对象是否存活一般有两种方式 引用计数每个对象有一个引用计数属性新增一个引用时计数加1引用释放时计数减1计数为0时可以回收。此方法简单无法解决对象相互循环引用的问题。 可达性分析(Reachability Analysis)从GC Roots开始向下搜索搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时则证明此对象是不可用的不可达对象。 14.JVM的永久代中会发生垃圾回收么 垃圾回收不会发生在永久代如果永久代满了或者是超过了临界值会触发完全垃圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。请参考下Java8从永久代到元数据区 (注Java8中已经移除了永久代新加了一个叫做元数据区的native内存区) 15.引用的分类 强引用GC时不会被回收 软引用描述有用但不是必须的对象在发生内存溢出异常之前被回收 弱引用描述有用但不是必须的对象在下一次GC时被回收 虚引用(幽灵引用/幻影引用):无法通过虚引用获得对象用PhantomReference实现虚引用虚引用用来在GC时返回一个通知。 ###GC是什么为什么要有GC 答GC是垃圾收集的意思内存处理是编程人员容易出现问题的地方忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理因为垃圾收集器会自动进行管理。要请求垃圾收集可以调用下面的方法之一System.gc() 或Runtime.getRuntime().gc() 但JVM可以屏蔽掉显示的垃圾回收调用。 垃圾回收可以有效的防止内存泄露有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。在Java诞生初期垃圾回收是Java最大的亮点之一因为服务器端的编程需要有效的防止内存泄露问题然而时过境迁如今Java的垃圾回收机制已经成为被诟病的东西。移动智能终端用户通常觉得iOS的系统比Android系统有更好的用户体验其中一个深层次的原因就在于android系统中垃圾回收的不可预知性。 补充垃圾回收机制有很多种包括分代复制垃圾回收、标记垃圾回收、增量垃圾回收等方式。标准的Java进程既有栈又有堆。栈保存了原始型局部变量堆保存了要创建的对象。Java平台对堆内存回收和再利用的基本算法被称为标记和清除但是Java对其进行了改进采用“分代式垃圾收集”。这种方法会跟Java对象的生命周期将堆内存划分为不同的区域在垃圾收集过程中可能会将对象移动到不同区域 伊甸园(Eden)这是对象最初诞生的区域并且对大多数对象来说这里是它们唯一存在过的区域。 幸存者乐园(Survivor)从伊甸园幸存下来的对象会被挪到这里。 终身颐养园(Tenured)这是足够老的幸存对象的归宿。年轻代收集(Minor-GC)过程是不会触及这个地方的。当年轻代收集不能把对象放进终身颐养园时就会触发一次完全收集(Major-GC)这里可能还会牵扯到压缩以便为大对象腾出足够的空间。 与垃圾回收相关的JVM参数 -Xms / -Xmx — 堆的初始大小 / 堆的最大大小 -Xmn — 堆中年轻代的大小 -XX:-DisableExplicitGC — 让System.gc()不产生任何作用 -XX:PrintGCDetails — 打印GC的细节 -XX:PrintGCDateStamps — 打印GC操作的时间戳 -XX:NewSize / XX:MaxNewSize — 设置新生代大小/新生代最大大小 -XX:NewRatio — 可以设置老生代和新生代的比例 -XX:PrintTenuringDistribution — 设置每次新生代GC后输出幸存者乐园中对象年龄的分布 -XX:InitialTenuringThreshold / -XX:MaxTenuringThreshold设置老年代阀值的初始值和最大值 -XX:TargetSurvivorRatio设置幸存区的目标使用率 16.判断一个对象应该被回收 1.该对象没有与GC Roots相连 2.该对象没有重写finalize()方法或finalize()已经被执行过则直接回收(第一次标记)、否则将对象加入到F-Queue队列中(优先级很低的队列)在这里finalize()方法被执行之后进行第二次标记如果对象仍然应该被GC则GC否则移除队列。 (在finalize方法中对象很可能和其他 GC Roots中的某一个对象建立了关联finalize方法只会被调用一次且不推荐使用finalize方法) 17.回收方法区 方法区回收价值很低主要回收废弃的常量和无用的类。 如何判断无用的类 1.该类所有实例都被回收(Java堆中没有该类的对象) 2.加载该类的ClassLoader已经被回收 3.该类对应的java.lang.Class对象没有在任何地方被引用无法在任何地方利用反射访问该类 18.垃圾收集算法 GC最基础的算法有三种 标记 -清除算法、复制算法、标记-压缩算法我们常用的垃圾回收器一般都采用分代收集算法。 标记 -清除算法“标记-清除”(Mark-Sweep)算法如它的名字一样算法分为“标记”和“清除”两个阶段首先标记出所有需要回收的对象在标记完成后统一回收掉所有被标记的对象。 复制算法“复制”(Copying)的收集算法它将可用内存按容量划分为大小相等的两块每次只使用其中的一块。当这一块的内存用完了就将还存活着的对象复制到另外一块上面然后再把已使用过的内存空间一次清理掉。 标记-压缩算法标记过程仍然与“标记-清除”算法一样但后续步骤不是直接对可回收对象进行清理而是让所有存活的对象都向一端移动然后直接清理掉端边界以外的内存 分代收集算法“分代收集”(Generational Collection)算法把Java堆分为新生代和老年代这样就可以根据各个年代的特点采用最适当的收集算法。 19.垃圾回收器 Serial收集器串行收集器是最古老最稳定以及效率高的收集器可能会产生较长的停顿只使用一个线程去回收。 ParNew收集器ParNew收集器其实就是Serial收集器的多线程版本。 Parallel收集器Parallel Scavenge收集器类似ParNew收集器Parallel收集器更关注系统的吞吐量。 Parallel Old 收集器Parallel Old是Parallel Scavenge收集器的老年代版本使用多线程和“标记整理”算法 CMS收集器CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。 G1收集器G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征 20.GC日志分析 摘录GC日志一部分(前部分为年轻代gc回收后部分为full gc回收) 2016-07-05T10:43:18.0930800: 25.395: [GC [PSYoungGen: 274931K-10738K(274944K)] 371093K-147186K(450048K), 0.0668480 secs] [Times: user0.17 sys0.08, real0.07 secs] 2016-07-05T10:43:18.1600800: 25.462: [Full GC [PSYoungGen: 10738K-0K(274944K)] [ParOldGen: 136447K-140379K(302592K)] 147186K-140379K(577536K) [PSPermGen: 85411K-85376K(171008K)], 0.6763541 secs] [Times: user1.75 sys0.02, real0.68 secs] 通过上面日志分析得出PSYoungGen、ParOldGen、PSPermGen属于Parallel收集器。其中PSYoungGen表示gc回收前后年轻代的内存变化ParOldGen表示gc回收前后老年代的内存变化PSPermGen表示gc回收前后永久区的内存变化。young gc 主要是针对年轻代进行内存回收比较频繁耗时短full gc 会对整个堆内存进行回城耗时长因此一般尽量减少full gc的次数 21.调优命令 Sun JDK监控和故障处理命令有jps jstat jmap jhat jstack jinfo jpsJVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。 jstatJVM statistics Monitoring是用于监视虚拟机运行时状态信息的命令它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。 jmapJVM Memory Map命令用于生成heap dump文件 jhatJVM Heap Analysis Tool命令是与jmap搭配使用用来分析jmap生成的dumpjhat内置了一个微型的HTTP/HTML服务器生成dump的分析结果后可以在浏览器中查看 jstack用于生成java虚拟机当前时刻的线程快照。 jinfoJVM Configuration info 这个命令作用是实时查看和调整虚拟机运行参数。 22.调优工具 常用调优工具分为两类,jdk自带监控工具jconsole和jvisualvm第三方有MAT(Memory Analyzer Tool)、GChisto。 jconsoleJava Monitoring and Management Console是从java5开始在JDK中自带的java监控和管理控制台用于对JVM中内存线程和类等的监控 jvisualvmjdk自带全能工具可以分析内存快照、线程快照监控内存变化、GC变化等。 MATMemory Analyzer Tool一个基于Eclipse的内存分析工具是一个快速、功能丰富的Java heap分析工具它可以帮助我们查找内存泄漏和减少内存消耗 GChisto一款专业分析gc日志的工具 23Minor GC与Full GC分别在什么时候发生 新生代内存不够用时候发生MGC也叫YGCJVM内存不够的时候发生FGC 24.你知道哪些JVM性能调优 设定堆内存大小 -Xmx堆内存最大限制。 设定新生代大小。 新生代不宜太小否则会有大量对象涌入老年代 -XX:NewSize新生代大小 -XX:NewRatio 新生代和老生代占比 -XX:SurvivorRatio伊甸园空间和幸存者空间的占比 设定垃圾回收器 年轻代用 -XX:UseParNewGC 年老代用-XX:UseConcMarkSweepGC
http://www.w-s-a.com/news/54264/

相关文章:

  • 嘉兴网站制作哪里好asp网站源码免费版
  • 如何给网站配置域名百度网站统计添加网址
  • 搭建wap网站磁力引擎
  • 如何给公司网站做推广个人网站可以做社区吗
  • 网站建设为什么不给源代码大理如何做百度的网站
  • 网站代理违法吗网站备份流程
  • 免费域名查询网站wordpress wordfence
  • h5响应式网站模板制作巴南网站制作
  • 网站方案报价软文什么意思
  • 电子商城网站如何建设上海公司车牌价格
  • 丽江网站设计公司专业公司网站设计企业
  • iis怎么建设网站特色产品推广方案
  • 道路建设网站专题品牌网站建设特色大蝌蚪
  • 网站开发组合 所有组合如何做com的网站
  • 电商网站怎么做的Wordpress 报表的插件
  • 纹理网站推荐买了两台服务器可以做网站吗
  • 机关公文写作网站南宁互联网推广
  • 五指山网站开发价格免费申请网站域名
  • 帝国音乐网站怎么做数据表电脑优化软件
  • 做国外网站收款怎么收建筑人才招聘网站
  • 毕设做桌面端还是网站sns社交网站 建设
  • 建设一个网站需要注意哪些内容wordpress 进销存
  • 沈阳市建设局网站sem优化师是什么意思
  • 餐饮vi设计公司网站排名优化方法讲解
  • 无线昆明官方网站可以做书的网站
  • 信誉最好的20个网投网站凡科网站建设之后怎么删除
  • 天津网站开发技术广州网站优化公司排名
  • 养老做增减的网站医院网站怎么做优化排名
  • 企业网站的推广方法有哪些上海猎头公司前十名
  • 电商网站建设建议免费下载app