一、简介
首先,我们要知道JVM中的垃圾是指什么:
在 JVM 的眼中,垃圾就是指那些在堆中存在的,已经“死亡”的对象。JVM进行垃圾回收之前,首先要判断哪些对象是垃圾(可销毁,占用内存可被回收)。
在 Java体系中,几乎所有的对象实例都在堆中存放,所以垃圾回收也主要是针对堆来进行的。
在JAVA体系中,垃圾回收机制指的就是对象的内存回收机制(回收目标、回收策略),这种回收是不需要程序员主动操作的,由虚拟机在后台完成。
首先,我们要知道JVM中的垃圾是指什么:
在 JVM 的眼中,垃圾就是指那些在堆中存在的,已经“死亡”的对象。JVM进行垃圾回收之前,首先要判断哪些对象是垃圾(可销毁,占用内存可被回收)。
在 Java体系中,几乎所有的对象实例都在堆中存放,所以垃圾回收也主要是针对堆来进行的。
在JAVA体系中,垃圾回收机制指的就是对象的内存回收机制(回收目标、回收策略),这种回收是不需要程序员主动操作的,由虚拟机在后台完成。
JVM提供的参数非常多,熟悉常用JVM参数能够帮助我们更好的进行调优
本篇文章将总结JVM参数的分类,以及GC日志、运行时内存区、OOM、垃圾收集器相关的常用参数。
这里以new关键字来创建对象。
在虚拟机的常量池区域定位对应类的符号引用。
判断这个符号引用代表的类是否被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。
在堆中分配对象内存,内存的大小在类加载后便已完全确定。分配方式有两种:指针碰撞、空闲列表。具体采用哪一种取决于堆内存是否规整。
关于分配时的并发安全:虚拟机采用CAS+失败重试的方式保证并发分配内存,如果开启了TLAB参数(本地线程分配缓冲区),则哪个线程要分配内存,就在哪个线程的TLAB上进行分配,只有当TLAB区域用完时,才对堆内存进行同步锁定。
内存分配完成后,对分配到的内存空间进行初始化(例如相关数据类型的默认值),然后对对象头中的描述信息进行必要的设置(例如对象的哈希码、GC分代年龄、类的元数据信息等等)。
在上面的工作都完成后,从虚拟机的视角来看,一个新对象已经产生了,但站在JAVA程序的角度,对象创建才刚刚开始,接下来需要把对象按照程序员的意愿进行初始化(比如执行一些构造方法,init方法等等),这样一个真正可用的对象才算完全产生出来。
JVM(Java Virtual Machine,Java虚拟机),是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机平台(操作系统)上仿真模拟各种计算机功能来实现的。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。
Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码class文件),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java能够“一次编译,到处运行”的原因。
I : Input 代表输入 O : Output 代表输出
通过IO可以完成硬盘文件的读和写。
IO流分为四大类:输入流、输出流、字节流、字符流。
1)以内存作为参照物,按照 流的方向 进行分类:
往内存中去:叫做输入(Input)。或者叫做读(Read)。 从内存中出来:叫做输出(Output)。或者叫做写(Write)。
网络编程的目的: 直接或间接地通过网络协议与其它计算机实现数据交换,进行通讯。
实现网络通信需要解决的两个问题:
1)计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。 计算机网络按其覆盖的地理范围可分为如下3类:
大家好呀,我是代码小郭,专注JAVA领域知识学习和分享。 我的个人网站地址戳这里 还在建设中,欢迎来喷。
在日常生活工作中,我们都会提前想一些预案来预防一些可能会发生的事情,但不管怎么预防,总会出现一些意料之外的事情,比如最近的水灾,还有火灾,简直防不胜防啊。
异常这个词,就有"未知的意外"的意思。意外出现了,总得想办法处理吧?如果我不知道该如何处理,那我应该提交给我的上一级去处理吧?
AbstractQueuedSynchronizer(简称AQS)是JAVA中一套实现锁机制的底层框架,Java中著名的JUC包的核心就是AQS框架。
AQS框架内部维护一个FIFO类型的Node队列来控制多线程的竞争排队顺序,使用一个int类型的state变量来定义当前共享资源占用的状态,定义了若干同步状态获取和释放的方法来供开发者使用,开发者只需要继承AbstractQueuedSynchronizer类,然后实现其中的指定模板方法,就可以快速实现一套线程同步控制组件。
AQS框架还定义了condition结构来提供线程的wait/signal(等待和唤醒)机制,同时根据资源互斥级别提供了独占锁/共享锁两种锁控制方式。
面试时经常会被问到:你了解哪些并发编程中的工具类?
上面的问题如果你答不上,我赌十包辣条,你这次面试肯定凉凉了。
对于JDK提供的并发编程工具,我们必须了解常见的几种:
下面代码实现了一个简单的,比较潦草的线程池~
public interface ThreadPool<T> {
// 执行一个 Job,这个 Job 需要实现 Runnable
void execute(T job);
// 关闭线程池
void shutdown();
// 增加工作者线程
void addWorkers(int num);
// 减少工作者线程
void removeWorker(int num);
// 得到正在等待执行的任务数量
int getJobSize();
}