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

深圳网站建设公司哪里好怎么做像小刀网一样的网站

深圳网站建设公司哪里好,怎么做像小刀网一样的网站,中国建设银行官网查询,金华网站制作价格1、JVN内存结构方法区和对是所有线程共享的内存区域#xff1b;而java栈、本地方法栈和程序员计数器是运行是线程私有的内存区域。Java堆(Heap),是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域#xff0c;在虚拟机启动时创建。此内存区域的唯一…1、JVN内存结构方法区和对是所有线程共享的内存区域而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方法服务。2、对象分配规则对象优先分配在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。3、解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法通常我们定义一个基本数据类型的变量一个对象的引用还有就是函数调用的现场保存都使用内存中的栈空间而通过new关键字和构造器创建的对象放在堆空间程序中的字面量(literal)如直接书写的100、”hello”和常量都是放在静态区中。栈空间操作起来最快但是栈很小通常大量的对象都是放在堆空间理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。String str  new String(hello);上面的语句中变量str放在栈上用new创建出来的字符串对象放在堆上而”hello”这个字面量放在静态区。4、Perm Space中保存什么数据会引起OutOfMemory吗Perm Space中保存的是加载class文件。会引起出现异常可以设置 -XX:PermSize 的大小。JDK 1.8后字符串常量不存放在永久带而是在堆内存中JDK8以后没有永久代概念而是用元空间替代元空间不存在虚拟机中二是使用本地内存。5、什么是类的加载类的加载指的是将类的.class文件中的二进制数据读入到内存中将其放在运行时数据区的方法区内然后在堆区创建一个java.lang.Class对象用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象Class对象封装了类在方法区内的数据结构并且向Java程序员提供了访问方法区内的数据结构的接口。类加载器启动类加载器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)所指定的类开发者可以直接使用该类加载器双亲委派机制类加载器收到类加载请求自己不加载向上委托给父类加载父类加载不了再自己加载。优势就是避免Java核心API篡改。6、如何⾃定义⼀个类加载器你使⽤过哪些或者你在什么场景下需要⼀个⾃ 定义的类加载器吗自定义类加载的意义加载特定路径的class文件加载一个加密的网络class文件热部署加载class文件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的引用。下面是关于几个类加载器的说明ootstrap一般用本地代码实现负责加载JVM基础核心类库(rt.jar)Extension从java.ext.dirs系统属性所指定的目录中加载类库它的父加载器是BootstrapSystem又叫应用类加载器其父类是Extension。它是应用最广泛的类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类是用户自定义加载器的默认父加载器。8、Java对象创建过程JVM遇到一条新建对象的指令时首先去检查这个指令的参数是否能在常量池中定义到一个类的符号引用。然后加载这个类(类加载过程在后边讲)为对象分配内存。一种办法“指针碰撞”、一种办法“空闲列表”最终常用的办法“本地线程缓冲分配(TLAB)”将除对象头外的对象内存空间初始化为0对对象头进行必要设置9、类的生命周期类的生命周期包括这几个部分加载、连接、初始化、使用和卸载其中前三部是类的加载的过程,如下图:加载查找并加载类的二进制数据在Java堆中也创建一个java.lang.Class类的对象连接连接又包含三块内容验证、准备、初始化。 1)验证文件格式、元数据、字节码、符号引用验证 2)准备为类的静态变量分配内存并将其初始化为默认值 3)解析把类中的符号引用转换为直接引用初始化为类的静态变量赋予正确的初始值使用new出对象程序中使用卸载执行垃圾回收10、Java 中会存在内存泄漏吗请简单描述。理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因)然而在实际开发中可能会存在无用但可达的对象这些对象不能被GC回收因此也会导致内存泄露的发生。例如hibernate的Session(一级缓存)中的对象属于持久态垃圾回收器是不会回收这些对象的然而这些对象中可能存在无用的垃圾对象如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露。下面例子中的代码也会导致内存泄露。import java.util.Arrays;import java.util.EmptyStackException;public class MyStack {private T[] elements;private int size  0;private static final int INIT_CAPACITY  16;public MyStack() {elements  (T[]) new Object[INIT_CAPACITY];}public void push(T elem) {ensureCapacity();elements[size]  elem;}public T pop() {if(size  0)throw new EmptyStackException();return elements[--size];}private void ensureCapacity() {if(elements.length  size) {elements  Arrays.copyOf(elements, 2 * size  1);}}}上面的代码实现了一个栈(先进后出(FILO))结构乍看之下似乎没有什么明显的问题它甚至可以通过你编写的各种单元测试。 然而其中的pop方法却存在内存泄露的问题当我们用pop方法弹出栈中的对象时该对象不会被当作垃圾回收即使使用栈的程序不再引用这些对象因为栈内部维护着对这些对象的过期引用(obsolete reference)。在支持垃圾回收的语言中内存泄露是很隐蔽的这种内存泄露其实就是无意识的对象保持。 如果一个对象引用被无意识的保留起来了那么垃圾回收器不会处理这个对象也不会处理该对象引用的其他对象即使这样的对象只有少数几个也可能会导致很多的对象被排除在垃圾回收之外从而对性能造成重大影响极端情况下会引发Disk Paging(物理内存与硬盘的虚拟内存交换数据)甚至造成OutOfMemoryError。11、GC是什么为什么要有GCGC是垃圾收集的意思内存处理是编程人员容易出现问题的地方忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃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设置幸存区的目标使用率12、做GC时⼀个对象在内存各个Space中被移动的顺序是什么标记清除法复制算法标记整理、分代算法。新生代一般采用复制算法 GC老年代使用标记整理算法。垃圾收集器串行新生代收集器、串行老生代收集器、并行新生代收集器、并行老年代收集器。CMS(Current Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器它是一种并发收集器采用的是Mark-Sweep算法。13、你知道哪些垃圾回收算法GC最基础的算法有三种 标记 -清除算法、复制算法、标记-压缩算法我们常用的垃圾回收器一般都采用分代收集算法。标记-清除算法“标记-清除”(Mark-Sweep)算法如它的名字一样算法分为“标记”和“清除”两个阶段首先标记出所有需要回收的对象在标记完成后统一回收掉所有被标记的对象。复制算法“复制”(Copying)的收集算法它将可用内存按容量划分为大小相等的两块每次只使用其中的一块。当这一块的内存用完了就将还存活着的对象复制到另外一块上面然后再把已使用过的内存空间一次清理掉。标记-压缩算法标记过程仍然与“标记-清除”算法一样但后续步骤不是直接对可回收对象进行清理而是让所有存活的对象都向一端移动然后直接清理掉端边界以外的内存分代收集算法“分代收集”(Generational Collection)算法把Java堆分为新生代和老年代这样就可以根据各个年代的特点采用最适当的收集算法。14、垃圾回收器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停顿时间要求的同时,还具备高吞吐量性能特征15、如何判断一个对象是否应该被回收判断对象是否存活一般有两种方式引用计数每个对象有一个引用计数属性新增一个引用时计数加1引用释放时计数减1计数为0时可以回收。此方法简单无法解决对象相互循环引用的问题。可达性分析(Reachability Analysis)从GC Roots开始向下搜索搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时则证明此对象是不可用的不可达对象。16、JVM的永久代中会发生垃圾回收么垃圾回收不会发生在永久代如果永久代满了或者是超过了临界值会触发完全垃圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。请参考下Java8从永久代到元数据区 (注Java8中已经移除了永久代新加了一个叫做元数据区的native内存区)17、引用的分类强引用GC时不会被回收软引用描述有用但不是必须的对象在发生内存溢出异常之前被回收弱引用描述有用但不是必须的对象在下一次GC时被回收虚引用(幽灵引用/幻影引用):无法通过虚引用获得对象用PhantomReference实现虚引用虚引用用来在GC时返回一个通知。18、调优命令Sun JDK监控和故障处理命令有jps jstat jmap jhat jstack jinfojpsJVM 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 这个命令作用是实时查看和调整虚拟机运行参数。19、调优工具常用调优工具分为两类,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日志的工具20、jstack 是⼲什么的? jstat 呢如果线上程序周期性地出现卡顿你怀疑可 能是 GC 导致的你会怎么来排查这个问题线程⽇志⼀般你会看其中的什么 部分jstack 用来查询 Java 进程的堆栈信息。jvisualvm 监控内存泄露跟踪垃圾回收、执行时内存、cpu分析、线程分析。21、Minor GC与Full GC分别在什么时候发生新生代内存不够用时候发生MGC也叫YGCJVM内存不够的时候发生FGC22、你有没有遇到过OutOfMemory问题你是怎么来处理这个问题的处理 过程中有哪些收获permgen space、heap space 错误。常见的原因内存加载的数据量太大一次性从数据库取太多数据集合类中有对对象的引用使用后未清空GC不能进行回收代码中存在循环产生过多的重复对象启动参数堆内存值小。23、JDK 1.8之后Perm Space有哪些变动? MetaSpace⼤⼩默认是⽆限的么? 还是你们会通过什么⽅式来指定⼤⼩JDK 1.8后用元空间替代了 Perm Space字符串常量存放到堆内存中。MetaSpace大小默认没有限制一般根据系统内存的大小。JVM会动态改变此值。-XX:MetaspaceSize分配给类元数据空间(以字节计)的初始大小(Oracle逻辑存储上的初始高水位the initial high-water-mark)。此值为估计值MetaspaceSize的值设置的过大会延长垃圾回收时间。垃圾回收过后引起下一次垃圾回收的类元数据空间的大小可能会变大。-XX:MaxMetaspaceSize分配给类元数据空间的最大值超过此值就会触发Full GC此值默认没有限制但应取决于系统内存的大小。JVM会动态地改变此值。24、StackOverflow异常有没有遇到过⼀般你猜测会在什么情况下被触发如何指定⼀个线程的堆栈⼤⼩⼀般你们写多少栈内存溢出一般由栈内存的局部变量过爆了导致内存溢出。出现在递归方法参数个数过多递归过深递归没有出口。本人免费整理了Java高级资料涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程一共30G需要自己领取。传送门https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q
http://www.pierceye.com/news/708523/

相关文章:

  • 水利工程建设监理网站美食网站建设总结
  • 中化建工北京建设投资有限公司网站南沙网站建设方案
  • 东莞网站制作网站死链是什么
  • 网站开发哪种语言更安全seopc流量排名官网
  • 中国站长之家域名查询深圳html5网站推广价格
  • 商业网站建设案例视频上海猎头公司哪家好
  • 如何开个人网站seo诊断站长
  • wordpress rss 订阅乐陵seo推广
  • 公司做一个网站企业建设3D网站
  • 自己做的网站别人打不开网络系统建设与运维职业技能等级证书
  • 签名能留链接的网站数据库网站建设公司
  • 网站权重不够高 导致创建网站销售产品
  • 中国建设报网站做网站如何文字链接文字
  • 网站建设网站多少钱网站上做值机的app
  • 百度手机网站提交做网站优化的教程
  • wordpress建站教程贴吧网站建设的论文的参考文献
  • 公司网站设计建议php7 wordpress
  • 商城网站建设策划书扬中会建网站
  • 铜陵市网站建设如何建立小程序商城
  • 大型网站运营步骤做网站f12的用处
  • 静态网站什么意思微信开发者工具打不开
  • 建站到网站收录到优化通化北京网站建设
  • 网站开发作用wordpress mysuc cms
  • 网站开发人员的职责是什么石家庄外贸建站公司
  • 内外外贸购物网站建设网站顶部下拉广告
  • 深圳企业网站建设服务平台销售推广语
  • 做网站要什么资料百度网盘登录
  • 聚牛网站建设公司北京seo优化推广
  • 成都网站公司网站建设东莞大岭山电子厂
  • python建立简易网站网站界面设计的分类有哪几种